1bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe/*
2bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * Copyright (c) 2016 Richard Palethorpe <richiejp@f-m.fm>
3bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * Copyright (c) 2017 SUSE LLC
4bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *
5bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * This program is free software: you can redistribute it and/or modify
6bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * it under the terms of the GNU General Public License as published by
7bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * the Free Software Foundation, either version 2 of the License, or
8bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * (at your option) any later version.
9bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *
10bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * This program is distributed in the hope that it will be useful,
11bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * but WITHOUT ANY WARRANTY; without even the implied warranty of
12bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * GNU General Public License for more details.
14bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *
15bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * You should have received a copy of the GNU General Public License
16bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * along with this program. If not, see <http://www.gnu.org/licenses/>.
17bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe */
18bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe/*
19bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * Check that memory marked with MADV_DONTDUMP is not included in a core dump
20bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * and check that the same memory then marked with MADV_DODUMP is included in
21bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * a core dump.
22bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *
23bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * In order to reliably find the core dump this test temporarily changes the
24bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * system wide core_pattern setting. Meaning all core dumps will be sent to the
25bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * test's temporary dir until the setting is restored during cleanup.
26bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *
27bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe * Test flow: map memory,
28bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      write generated character sequence to memory,
29bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      start child process,
30bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      mark memory with MADV_DONTDUMP in child,
31bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      abort child,
32bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      scan child's core dump for character sequence,
33bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe *	      if the sequence is not found it is a pass otherwise a fail,
34bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe */
35bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
36bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <sys/types.h>
37bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <sys/wait.h>
38bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <sys/prctl.h>
39bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <fcntl.h>
40bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <unistd.h>
41bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <signal.h>
42bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <stdlib.h>
43bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include <stdio.h>
44bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
45bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include "tst_test.h"
46bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#include "lapi/mmap.h"
47bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
48bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#define CORE_PATTERN "/proc/sys/kernel/core_pattern"
49bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#define CORE_FILTER "/proc/self/coredump_filter"
50bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#define YCOUNT 0x500L
51bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe#define FMEMSIZE (YCOUNT + 0x2L)
52316d406323f88736ea37909a11b4239051ea95daSandeep Patil#define CORENAME_MAX_SIZE 512
53bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
54bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic int dfd;
55bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic void *fmem;
56316d406323f88736ea37909a11b4239051ea95daSandeep Patilstatic char cpattern[CORENAME_MAX_SIZE];
57316d406323f88736ea37909a11b4239051ea95daSandeep Patilstatic int restore_cpattern;
58bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
59bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic void setup(void)
60bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe{
61bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char cwd[1024];
62bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char tmpcpattern[1048];
63bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char *fmemc;
64bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	int i;
65bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	unsigned int filter;
66bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	struct rlimit limit;
67bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
68bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	limit.rlim_max = RLIM_INFINITY;
69bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	limit.rlim_cur = limit.rlim_max;
70bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_SETRLIMIT(RLIMIT_CORE, &limit);
71bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
72bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	switch (prctl(PR_GET_DUMPABLE)) {
73bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	case 0:
74bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		tst_brk(TCONF, "Process is not dumpable.");
75bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	case 1:
76bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		break;
77bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	default:
78bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		tst_brk(TBROK | TERRNO, "prctl(PR_GET_DUMPABLE)");
79bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	}
80bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
81bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_FILE_SCANF(CORE_FILTER, "%x", &filter);
82bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (!(0x1 & filter))
83bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		tst_brk(TCONF, "Anonymous private memory is not dumpable.");
84bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
85316d406323f88736ea37909a11b4239051ea95daSandeep Patil	SAFE_FILE_SCANF(CORE_PATTERN, "%s[^\n]", cpattern);
86316d406323f88736ea37909a11b4239051ea95daSandeep Patil	restore_cpattern = 1;
87bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	tst_res(TINFO, "System core pattern is '%s'", cpattern);
88bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
89bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_GETCWD(cwd, sizeof(cwd));
90bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	snprintf(tmpcpattern, sizeof(tmpcpattern), "%s/dump-%%p", cwd);
91bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	tst_res(TINFO, "Temporary core pattern is '%s'", tmpcpattern);
92bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_FILE_PRINTF(CORE_PATTERN, "%s", tmpcpattern);
93bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
94bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	fmem = SAFE_MMAP(NULL,
95bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			 FMEMSIZE,
96bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			 PROT_READ | PROT_WRITE,
97bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			 MAP_ANONYMOUS | MAP_PRIVATE,
98bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			 -1,
99bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			 0);
100bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
101bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	/*
102bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	 * Write a generated character sequence to the mapped memory,
103bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	 * which we later look for in the core dump.
104bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	 */
105bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	fmemc = (char *)fmem;
106bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	*fmemc = 'x';
107bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	for (i = 0; i < YCOUNT; i++)
108bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		fmemc[i + 1] = 'y';
109bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	fmemc[++i] = 'z';
110bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe}
111bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
112bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic void cleanup(void)
113bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe{
114316d406323f88736ea37909a11b4239051ea95daSandeep Patil	if (restore_cpattern)
115e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis		SAFE_FILE_PRINTF(CORE_PATTERN, "%s", cpattern);
116e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis
117e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis	if (fmem)
118e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis		SAFE_MUNMAP(fmem, FMEMSIZE);
119bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
120e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis	if (dfd > 0)
121e1c49edf1e9a7de95250c6aa6b122723531934ecCyril Hrubis		SAFE_CLOSE(dfd);
122bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe}
123bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
124bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic int find_sequence(int pid)
125bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe{
126bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char expectc = 'x';
127bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	ssize_t read, pos = 0;
128bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char rbuf[1024];
129bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	int ycount = 0;
130bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char dumpname[256];
131bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
132bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	snprintf(dumpname, 256, "dump-%d", pid);
133bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	tst_res(TINFO, "Dump file should be %s", dumpname);
134bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (access(dumpname, F_OK))
135bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		tst_brk(TBROK | TERRNO, "Dump file was not found.");
136bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
137bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	dfd = SAFE_OPEN(dumpname, O_RDONLY);
138bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
139bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	read = SAFE_READ(0, dfd, &rbuf, sizeof(rbuf));
140bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	while (read) {
141bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		switch (rbuf[pos]) {
142bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		case 'x':
143bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			ycount = 0;
144bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			expectc = 'y';
145bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			break;
146bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		case 'y':
147bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			if (expectc == 'y') {
148bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				ycount++;
149bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			} else {
150bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				expectc = 'x';
151bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				break;
152bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			}
153bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
154bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			if (ycount == YCOUNT)
155bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				expectc = 'z';
156bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			break;
157bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		case 'z':
158bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			if (expectc == 'z') {
159bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				SAFE_CLOSE(dfd);
160bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				return 1;
161bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			}
162bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		default:
163bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			expectc = 'x';
164bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		}
165bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		if (++pos >= read) {
166bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			read = SAFE_READ(0, dfd, &rbuf, sizeof(rbuf));
167bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			pos = 0;
168bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		}
169bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	}
170bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
171bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_CLOSE(dfd);
172bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	return 0;
173bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe}
174bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
175bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic pid_t run_child(int advice)
176bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe{
177bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	int status;
178bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	pid_t pid;
179bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	char *advstr =
180bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		advice == MADV_DONTDUMP ? "MADV_DONTDUMP" : "MADV_DODUMP";
181bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
182bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	pid = SAFE_FORK();
183bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (pid == 0) {
184bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		if (madvise(fmem, FMEMSIZE, advice) == -1) {
185bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			tst_res(TFAIL | TERRNO,
186bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				"madvise(%p, %lu, %s) = -1",
187bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				fmem,
188bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				FMEMSIZE,
189bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				advstr);
190bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			exit(1);
191bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		}
192bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		abort();
193bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	}
194bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
195bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	SAFE_WAITPID(pid, &status, 0);
196bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (WIFSIGNALED(status) && WCOREDUMP(status))
197bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		return pid;
198bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (WIFEXITED(status))
199bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		return 0;
200bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
201bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	tst_res(TCONF, "No coredump produced after signal (%d)",
202bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		WTERMSIG(status));
203bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
204bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	return 0;
205bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe}
206bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
207bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic void run(unsigned int test_nr)
208bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe{
209bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	pid_t pid;
210bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
211bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	if (!test_nr) {
212bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		pid = run_child(MADV_DONTDUMP);
213bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		if (pid && find_sequence(pid))
214bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			tst_res(TFAIL,
215bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				"Found sequence in dump when MADV_DONTDUMP set");
216bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		else if (pid)
217bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			tst_res(TPASS, "madvise(..., MADV_DONTDUMP)");
218bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	} else {
219bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		pid = run_child(MADV_DODUMP);
220bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		if (pid && find_sequence(pid))
221bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			tst_res(TPASS, "madvise(..., MADV_DODUMP)");
222bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe		else if (pid)
223bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe			tst_res(TFAIL,
224bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe				"No sequence in dump after MADV_DODUMP.");
225bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	}
226bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe}
227bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe
228bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpestatic struct tst_test test = {
229bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.test = run,
230bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.tcnt = 2,
231bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.setup = setup,
232bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.cleanup = cleanup,
233bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.min_kver = "3.4.0",
234bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.needs_tmpdir = 1,
235bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.needs_root = 1,
236bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe	.forks_child = 1
237bf7831dd2b0aa406e186b721b91905f5fe902414Richard Palethorpe};
238