1*49a6e16fSderaadt /* $OpenBSD: t_minherit.c,v 1.2 2021/12/13 16:56:48 deraadt Exp $ */
2abbaa274Smbuhl /* $NetBSD: t_minherit.c,v 1.1 2014/07/18 12:34:52 christos Exp $ */
3abbaa274Smbuhl
4abbaa274Smbuhl /*-
5abbaa274Smbuhl * Copyright (c) 2014 The NetBSD Foundation, Inc.
6abbaa274Smbuhl * All rights reserved.
7abbaa274Smbuhl *
8abbaa274Smbuhl * This code is derived from software contributed to The NetBSD Foundation
9abbaa274Smbuhl * by Christos Zoulas
10abbaa274Smbuhl *
11abbaa274Smbuhl * Redistribution and use in source and binary forms, with or without
12abbaa274Smbuhl * modification, are permitted provided that the following conditions
13abbaa274Smbuhl * are met:
14abbaa274Smbuhl * 1. Redistributions of source code must retain the above copyright
15abbaa274Smbuhl * notice, this list of conditions and the following disclaimer.
16abbaa274Smbuhl * 2. Redistributions in binary form must reproduce the above copyright
17abbaa274Smbuhl * notice, this list of conditions and the following disclaimer in the
18abbaa274Smbuhl * documentation and/or other materials provided with the distribution.
19abbaa274Smbuhl *
20abbaa274Smbuhl * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21abbaa274Smbuhl * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22abbaa274Smbuhl * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23abbaa274Smbuhl * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24abbaa274Smbuhl * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25abbaa274Smbuhl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26abbaa274Smbuhl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27abbaa274Smbuhl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28abbaa274Smbuhl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29abbaa274Smbuhl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30abbaa274Smbuhl * POSSIBILITY OF SUCH DAMAGE.
31abbaa274Smbuhl */
32abbaa274Smbuhl #include "macros.h"
33abbaa274Smbuhl
34abbaa274Smbuhl #include <sys/mman.h>
35abbaa274Smbuhl #include <sys/sysctl.h>
36abbaa274Smbuhl #include <sys/wait.h>
37abbaa274Smbuhl
38abbaa274Smbuhl #include <errno.h>
39abbaa274Smbuhl #include <fcntl.h>
40abbaa274Smbuhl #include <stdlib.h>
41abbaa274Smbuhl #include <string.h>
42*49a6e16fSderaadt #include <signal.h>
43abbaa274Smbuhl #include <unistd.h>
44abbaa274Smbuhl
45abbaa274Smbuhl #include "atf-c.h"
46abbaa274Smbuhl
47abbaa274Smbuhl static long page;
48abbaa274Smbuhl
49abbaa274Smbuhl static void *
makemap(int v,int f)50abbaa274Smbuhl makemap(int v, int f) {
51abbaa274Smbuhl void *map = mmap(NULL, page, PROT_READ|PROT_WRITE,
52abbaa274Smbuhl MAP_SHARED|MAP_ANON, -1, 0);
53abbaa274Smbuhl ATF_REQUIRE(map != MAP_FAILED);
54abbaa274Smbuhl memset(map, v, page);
55abbaa274Smbuhl if (f != 666)
56abbaa274Smbuhl ATF_REQUIRE(minherit(map, page, f) == 0);
57abbaa274Smbuhl else
58abbaa274Smbuhl ATF_REQUIRE(minherit(map, page, f) == -1);
59abbaa274Smbuhl return map;
60abbaa274Smbuhl }
61abbaa274Smbuhl
62abbaa274Smbuhl ATF_TC(minherit_copy);
ATF_TC_HEAD(minherit_copy,tc)63abbaa274Smbuhl ATF_TC_HEAD(minherit_copy, tc)
64abbaa274Smbuhl {
65abbaa274Smbuhl atf_tc_set_md_var(tc, "descr",
66abbaa274Smbuhl "Test for MAP_INHERIT_COPY from minherit(2)");
67abbaa274Smbuhl }
68abbaa274Smbuhl
ATF_TC_BODY(minherit_copy,tc)69abbaa274Smbuhl ATF_TC_BODY(minherit_copy, tc)
70abbaa274Smbuhl {
71abbaa274Smbuhl void *map1 = makemap(1, MAP_INHERIT_COPY);
72abbaa274Smbuhl void *map2 = makemap(1, MAP_INHERIT_COPY);
73abbaa274Smbuhl switch (fork()) {
74abbaa274Smbuhl default:
75abbaa274Smbuhl ATF_REQUIRE(wait(NULL) != -1);
76abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
77abbaa274Smbuhl break;
78abbaa274Smbuhl case -1:
79abbaa274Smbuhl ATF_REQUIRE(0);
80abbaa274Smbuhl break;
81abbaa274Smbuhl case 0:
82abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
83abbaa274Smbuhl memset(map1, 0, page);
84abbaa274Smbuhl exit(0);
85abbaa274Smbuhl }
86abbaa274Smbuhl }
87abbaa274Smbuhl
88abbaa274Smbuhl ATF_TC(minherit_share);
ATF_TC_HEAD(minherit_share,tc)89abbaa274Smbuhl ATF_TC_HEAD(minherit_share, tc)
90abbaa274Smbuhl {
91abbaa274Smbuhl atf_tc_set_md_var(tc, "descr",
92abbaa274Smbuhl "Test for MAP_INHERIT_SHARE from minherit(2)");
93abbaa274Smbuhl }
94abbaa274Smbuhl
ATF_TC_BODY(minherit_share,tc)95abbaa274Smbuhl ATF_TC_BODY(minherit_share, tc)
96abbaa274Smbuhl {
97abbaa274Smbuhl void *map1 = makemap(1, MAP_INHERIT_SHARE);
98abbaa274Smbuhl void *map2 = makemap(1, MAP_INHERIT_SHARE);
99abbaa274Smbuhl
100abbaa274Smbuhl switch (fork()) {
101abbaa274Smbuhl default:
102abbaa274Smbuhl ATF_REQUIRE(wait(NULL) != -1);
103abbaa274Smbuhl memset(map2, 0, page);
104abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
105abbaa274Smbuhl break;
106abbaa274Smbuhl case -1:
107abbaa274Smbuhl ATF_REQUIRE(0);
108abbaa274Smbuhl break;
109abbaa274Smbuhl case 0:
110abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
111abbaa274Smbuhl memset(map1, 0, page);
112abbaa274Smbuhl exit(0);
113abbaa274Smbuhl }
114abbaa274Smbuhl }
115abbaa274Smbuhl
116abbaa274Smbuhl static void
segv(int n)117abbaa274Smbuhl segv(int n) {
118abbaa274Smbuhl _exit(n);
119abbaa274Smbuhl }
120abbaa274Smbuhl
121abbaa274Smbuhl ATF_TC(minherit_none);
ATF_TC_HEAD(minherit_none,tc)122abbaa274Smbuhl ATF_TC_HEAD(minherit_none, tc)
123abbaa274Smbuhl {
124abbaa274Smbuhl atf_tc_set_md_var(tc, "descr",
125abbaa274Smbuhl "Test for MAP_INHERIT_NONE from minherit(2)");
126abbaa274Smbuhl }
127abbaa274Smbuhl
ATF_TC_BODY(minherit_none,tc)128abbaa274Smbuhl ATF_TC_BODY(minherit_none, tc)
129abbaa274Smbuhl {
130abbaa274Smbuhl void *map1 = makemap(0, MAP_INHERIT_NONE);
131abbaa274Smbuhl int status;
132abbaa274Smbuhl
133abbaa274Smbuhl switch (fork()) {
134abbaa274Smbuhl default:
135abbaa274Smbuhl ATF_REQUIRE(wait(&status) != -1);
136abbaa274Smbuhl ATF_REQUIRE(WEXITSTATUS(status) == SIGSEGV);
137abbaa274Smbuhl break;
138abbaa274Smbuhl case -1:
139abbaa274Smbuhl ATF_REQUIRE(0);
140abbaa274Smbuhl break;
141abbaa274Smbuhl case 0:
142abbaa274Smbuhl ATF_REQUIRE(signal(SIGSEGV, segv) != SIG_ERR);
143abbaa274Smbuhl memset(map1, 0, page);
144abbaa274Smbuhl exit(0);
145abbaa274Smbuhl }
146abbaa274Smbuhl }
147abbaa274Smbuhl
148abbaa274Smbuhl ATF_TC(minherit_zero);
ATF_TC_HEAD(minherit_zero,tc)149abbaa274Smbuhl ATF_TC_HEAD(minherit_zero, tc)
150abbaa274Smbuhl {
151abbaa274Smbuhl atf_tc_set_md_var(tc, "descr",
152abbaa274Smbuhl "Test for MAP_INHERIT_ZERO from minherit(2)");
153abbaa274Smbuhl }
154abbaa274Smbuhl
ATF_TC_BODY(minherit_zero,tc)155abbaa274Smbuhl ATF_TC_BODY(minherit_zero, tc)
156abbaa274Smbuhl {
157abbaa274Smbuhl void *map1 = makemap(1, MAP_INHERIT_ZERO);
158abbaa274Smbuhl void *map2 = makemap(0, MAP_INHERIT_SHARE);
159abbaa274Smbuhl
160abbaa274Smbuhl switch (fork()) {
161abbaa274Smbuhl default:
162abbaa274Smbuhl ATF_REQUIRE(wait(NULL) != -1);
163abbaa274Smbuhl memset(map2, 1, page);
164abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
165abbaa274Smbuhl break;
166abbaa274Smbuhl case -1:
167abbaa274Smbuhl ATF_REQUIRE(0);
168abbaa274Smbuhl break;
169abbaa274Smbuhl case 0:
170abbaa274Smbuhl ATF_REQUIRE(memcmp(map1, map2, page) == 0);
171abbaa274Smbuhl memset(map1, 2, page);
172abbaa274Smbuhl exit(0);
173abbaa274Smbuhl }
174abbaa274Smbuhl }
175abbaa274Smbuhl
176abbaa274Smbuhl ATF_TC(minherit_bad);
ATF_TC_HEAD(minherit_bad,tc)177abbaa274Smbuhl ATF_TC_HEAD(minherit_bad, tc)
178abbaa274Smbuhl {
179abbaa274Smbuhl atf_tc_set_md_var(tc, "descr",
180abbaa274Smbuhl "Test for bad minherit(2)");
181abbaa274Smbuhl }
182abbaa274Smbuhl
ATF_TC_BODY(minherit_bad,tc)183abbaa274Smbuhl ATF_TC_BODY(minherit_bad, tc)
184abbaa274Smbuhl {
185abbaa274Smbuhl (void)makemap(0, 666);
186abbaa274Smbuhl }
187abbaa274Smbuhl
ATF_TP_ADD_TCS(tp)188abbaa274Smbuhl ATF_TP_ADD_TCS(tp)
189abbaa274Smbuhl {
190abbaa274Smbuhl page = sysconf(_SC_PAGESIZE);
191abbaa274Smbuhl ATF_REQUIRE(page >= 0);
192abbaa274Smbuhl
193abbaa274Smbuhl ATF_TP_ADD_TC(tp, minherit_copy);
194abbaa274Smbuhl ATF_TP_ADD_TC(tp, minherit_share);
195abbaa274Smbuhl ATF_TP_ADD_TC(tp, minherit_none);
196abbaa274Smbuhl ATF_TP_ADD_TC(tp, minherit_zero);
197abbaa274Smbuhl ATF_TP_ADD_TC(tp, minherit_bad);
198abbaa274Smbuhl
199abbaa274Smbuhl return atf_no_error();
200abbaa274Smbuhl }
201