mmap_test.c revision 197543
1197543Sbz/*- 2197543Sbz * Copyright (c) 2009 Simon L. Nielsen <simon@FreeBSD.org>, 3197543Sbz * Bjoern A. Zeeb <bz@FreeBSD.org> 4197543Sbz * 5197543Sbz * Redistribution and use in source and binary forms, with or without 6197543Sbz * modification, are permitted provided that the following conditions 7197543Sbz * are met: 8197543Sbz * 1. Redistributions of source code must retain the above copyright 9197543Sbz * notice, this list of conditions and the following disclaimer. 10197543Sbz * 2. Redistributions in binary form must reproduce the above copyright 11197543Sbz * notice, this list of conditions and the following disclaimer in the 12197543Sbz * documentation and/or other materials provided with the distribution. 13197543Sbz * 14197543Sbz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15197543Sbz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16197543Sbz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17197543Sbz * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18197543Sbz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19197543Sbz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20197543Sbz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21197543Sbz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22197543Sbz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23197543Sbz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24197543Sbz * SUCH DAMAGE. 25197543Sbz * 26197543Sbz * $FreeBSD: head/tools/regression/mmap/mmap.c 197543 2009-09-27 21:03:33Z bz $ 27197543Sbz */ 28197543Sbz 29197543Sbz#include <sys/param.h> 30197543Sbz#include <sys/mman.h> 31197543Sbz#include <sys/sysctl.h> 32197543Sbz#include <sys/types.h> 33197543Sbz 34197543Sbz#include <stdio.h> 35197543Sbz#include <err.h> 36197543Sbz 37197543Sbzconst struct tests { 38197543Sbz void *addr; 39197543Sbz int ok[2]; /* Depending on security.bsd.mmap_zero {0, !=0}. */ 40197543Sbz} tests[] = { 41197543Sbz { (void *)0, { 0, 1 } }, /* Test sysctl. */ 42197543Sbz { (void *)1, { 0, 0 } }, 43197543Sbz { (void *)(PAGE_SIZE - 1), { 0, 0 } }, 44197543Sbz { (void *)PAGE_SIZE, { 1, 1 } }, 45197543Sbz { (void *)-1, { 0, 0 } }, 46197543Sbz { (void *)(-PAGE_SIZE), { 0, 0 } }, 47197543Sbz { (void *)(-1 - PAGE_SIZE), { 0, 0 } }, 48197543Sbz { (void *)(-1 - PAGE_SIZE - 1), { 0, 0 } }, 49197543Sbz { (void *)(0x1000 * PAGE_SIZE), { 1, 1 } }, 50197543Sbz}; 51197543Sbz 52197543Sbzint 53197543Sbzmain(void) 54197543Sbz{ 55197543Sbz void *p; 56197543Sbz size_t len; 57197543Sbz int i, error, mib[3], mmap_zero; 58197543Sbz 59197543Sbz error = 0; 60197543Sbz 61197543Sbz /* Get the current sysctl value of security.bsd.mmap_zero. */ 62197543Sbz len = sizeof(mib) / sizeof(*mib); 63197543Sbz if (sysctlnametomib("security.bsd.mmap_zero", mib, &len) == -1) 64197543Sbz err(1, "sysctlnametomib(security.bsd.mmap_zero)"); 65197543Sbz 66197543Sbz len = sizeof(mmap_zero); 67197543Sbz if (sysctl(mib, 3, &mmap_zero, &len, NULL, 0) == -1) 68197543Sbz err(1, "sysctl(security.bsd.mmap_zero)"); 69197543Sbz 70197543Sbz /* Normalize to 0 or 1 for array access. */ 71197543Sbz mmap_zero = !!mmap_zero; 72197543Sbz 73197543Sbz for (i=0; i < (sizeof(tests) / sizeof(*tests)); i++) { 74197543Sbz p = mmap((void *)tests[i].addr, PAGE_SIZE, 75197543Sbz PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_FIXED, 76197543Sbz -1, 0); 77197543Sbz if (p == MAP_FAILED) { 78197543Sbz if (tests[i].ok[mmap_zero] != 0) 79197543Sbz error++; 80197543Sbz warnx("%s: mmap(%p, ...) failed.", 81197543Sbz (tests[i].ok[mmap_zero] == 0) ? "OK " : "ERR", 82197543Sbz tests[i].addr); 83197543Sbz } else { 84197543Sbz if (tests[i].ok[mmap_zero] != 1) 85197543Sbz error++; 86197543Sbz warnx("%s: mmap(%p, ...) succeeded: p=%p", 87197543Sbz (tests[i].ok[mmap_zero] == 1) ? "OK " : "ERR", 88197543Sbz tests[i].addr, p); 89197543Sbz } 90197543Sbz } 91197543Sbz 92197543Sbz if (error) 93197543Sbz err(1, "---\nERROR: %d unexpected results.", error); 94197543Sbz 95197543Sbz return (error != 0); 96197543Sbz} 97