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