xref: /aosp_15_r20/external/ltp/lib/tst_safe_macros.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2017 Cyril Hrubis <[email protected]>
4*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2017-2024 Linux Test Project
5*49cdfc7eSAndroid Build Coastguard Worker  */
6*49cdfc7eSAndroid Build Coastguard Worker 
7*49cdfc7eSAndroid Build Coastguard Worker #define _GNU_SOURCE
8*49cdfc7eSAndroid Build Coastguard Worker #include <unistd.h>
9*49cdfc7eSAndroid Build Coastguard Worker #include <stdlib.h>
10*49cdfc7eSAndroid Build Coastguard Worker #include <errno.h>
11*49cdfc7eSAndroid Build Coastguard Worker #include <sched.h>
12*49cdfc7eSAndroid Build Coastguard Worker #include <sys/ptrace.h>
13*49cdfc7eSAndroid Build Coastguard Worker #include "config.h"
14*49cdfc7eSAndroid Build Coastguard Worker #ifdef HAVE_SYS_FANOTIFY_H
15*49cdfc7eSAndroid Build Coastguard Worker # include <sys/fanotify.h>
16*49cdfc7eSAndroid Build Coastguard Worker #endif
17*49cdfc7eSAndroid Build Coastguard Worker #define TST_NO_DEFAULT_MAIN
18*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
19*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/setns.h"
20*49cdfc7eSAndroid Build Coastguard Worker #include "tst_safe_macros.h"
21*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/personality.h"
22*49cdfc7eSAndroid Build Coastguard Worker #include "lapi/pidfd.h"
23*49cdfc7eSAndroid Build Coastguard Worker 
safe_access(const char * file,const int lineno,const char * pathname,int mode)24*49cdfc7eSAndroid Build Coastguard Worker int safe_access(const char *file, const int lineno,
25*49cdfc7eSAndroid Build Coastguard Worker 	    const char *pathname, int mode)
26*49cdfc7eSAndroid Build Coastguard Worker {
27*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
28*49cdfc7eSAndroid Build Coastguard Worker 
29*49cdfc7eSAndroid Build Coastguard Worker 	rval = access(pathname, mode);
30*49cdfc7eSAndroid Build Coastguard Worker 
31*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
32*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
33*49cdfc7eSAndroid Build Coastguard Worker 			"access(%s,%d) failed", pathname, mode);
34*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
35*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
36*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid access(%s,%d) return value %d", pathname,
37*49cdfc7eSAndroid Build Coastguard Worker 			mode, rval);
38*49cdfc7eSAndroid Build Coastguard Worker 	}
39*49cdfc7eSAndroid Build Coastguard Worker 
40*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
41*49cdfc7eSAndroid Build Coastguard Worker }
42*49cdfc7eSAndroid Build Coastguard Worker 
safe_setpgid(const char * file,const int lineno,pid_t pid,pid_t pgid)43*49cdfc7eSAndroid Build Coastguard Worker int safe_setpgid(const char *file, const int lineno, pid_t pid, pid_t pgid)
44*49cdfc7eSAndroid Build Coastguard Worker {
45*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
46*49cdfc7eSAndroid Build Coastguard Worker 
47*49cdfc7eSAndroid Build Coastguard Worker 	rval = setpgid(pid, pgid);
48*49cdfc7eSAndroid Build Coastguard Worker 
49*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
50*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
51*49cdfc7eSAndroid Build Coastguard Worker 			"setpgid(%i, %i) failed", pid, pgid);
52*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
53*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
54*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setpgid(%i, %i) return value %d", pid, pgid,
55*49cdfc7eSAndroid Build Coastguard Worker 			rval);
56*49cdfc7eSAndroid Build Coastguard Worker 	}
57*49cdfc7eSAndroid Build Coastguard Worker 
58*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
59*49cdfc7eSAndroid Build Coastguard Worker }
60*49cdfc7eSAndroid Build Coastguard Worker 
safe_getpgid(const char * file,const int lineno,pid_t pid)61*49cdfc7eSAndroid Build Coastguard Worker pid_t safe_getpgid(const char *file, const int lineno, pid_t pid)
62*49cdfc7eSAndroid Build Coastguard Worker {
63*49cdfc7eSAndroid Build Coastguard Worker 	pid_t pgid;
64*49cdfc7eSAndroid Build Coastguard Worker 
65*49cdfc7eSAndroid Build Coastguard Worker 	pgid = getpgid(pid);
66*49cdfc7eSAndroid Build Coastguard Worker 
67*49cdfc7eSAndroid Build Coastguard Worker 	if (pgid == -1) {
68*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "getpgid(%i) failed",
69*49cdfc7eSAndroid Build Coastguard Worker 			pid);
70*49cdfc7eSAndroid Build Coastguard Worker 	} else if (pgid < 0) {
71*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
72*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getpgid(%i) return value %d", pid, pgid);
73*49cdfc7eSAndroid Build Coastguard Worker 	}
74*49cdfc7eSAndroid Build Coastguard Worker 
75*49cdfc7eSAndroid Build Coastguard Worker 	return pgid;
76*49cdfc7eSAndroid Build Coastguard Worker }
77*49cdfc7eSAndroid Build Coastguard Worker 
safe_setgroups(const char * file,const int lineno,size_t size,const gid_t * list)78*49cdfc7eSAndroid Build Coastguard Worker int safe_setgroups(const char *file, const int lineno, size_t size, const gid_t *list)
79*49cdfc7eSAndroid Build Coastguard Worker {
80*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
81*49cdfc7eSAndroid Build Coastguard Worker 
82*49cdfc7eSAndroid Build Coastguard Worker 	rval = setgroups(size, list);
83*49cdfc7eSAndroid Build Coastguard Worker 
84*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
85*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
86*49cdfc7eSAndroid Build Coastguard Worker 			"setgroups(%zu, %p) failed", size, list);
87*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
88*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
89*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setgroups(%zu, %p) return value %d", size,
90*49cdfc7eSAndroid Build Coastguard Worker 			list, rval);
91*49cdfc7eSAndroid Build Coastguard Worker 	}
92*49cdfc7eSAndroid Build Coastguard Worker 
93*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
94*49cdfc7eSAndroid Build Coastguard Worker }
95*49cdfc7eSAndroid Build Coastguard Worker 
safe_getgroups(const char * file,const int lineno,int size,gid_t list[])96*49cdfc7eSAndroid Build Coastguard Worker int safe_getgroups(const char *file, const int lineno, int size, gid_t list[])
97*49cdfc7eSAndroid Build Coastguard Worker {
98*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
99*49cdfc7eSAndroid Build Coastguard Worker 
100*49cdfc7eSAndroid Build Coastguard Worker 	rval = getgroups(size, list);
101*49cdfc7eSAndroid Build Coastguard Worker 
102*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
103*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
104*49cdfc7eSAndroid Build Coastguard Worker 			"getgroups(%i, %p)", size, list);
105*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
106*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
107*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid getgroups(%i, %p) return value %d", size,
108*49cdfc7eSAndroid Build Coastguard Worker 			list, rval);
109*49cdfc7eSAndroid Build Coastguard Worker 	}
110*49cdfc7eSAndroid Build Coastguard Worker 
111*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
112*49cdfc7eSAndroid Build Coastguard Worker }
113*49cdfc7eSAndroid Build Coastguard Worker 
safe_personality(const char * filename,unsigned int lineno,unsigned long persona)114*49cdfc7eSAndroid Build Coastguard Worker int safe_personality(const char *filename, unsigned int lineno,
115*49cdfc7eSAndroid Build Coastguard Worker 		    unsigned long persona)
116*49cdfc7eSAndroid Build Coastguard Worker {
117*49cdfc7eSAndroid Build Coastguard Worker 	int prev_persona = personality(persona);
118*49cdfc7eSAndroid Build Coastguard Worker 
119*49cdfc7eSAndroid Build Coastguard Worker 	if (prev_persona == -1) {
120*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(filename, lineno, TBROK | TERRNO,
121*49cdfc7eSAndroid Build Coastguard Worker 			 "persona(%ld) failed", persona);
122*49cdfc7eSAndroid Build Coastguard Worker 	} else if (prev_persona < 0) {
123*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(filename, lineno, TBROK | TERRNO,
124*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid persona(%ld) return value %d", persona,
125*49cdfc7eSAndroid Build Coastguard Worker 			 prev_persona);
126*49cdfc7eSAndroid Build Coastguard Worker 	}
127*49cdfc7eSAndroid Build Coastguard Worker 
128*49cdfc7eSAndroid Build Coastguard Worker 	return prev_persona;
129*49cdfc7eSAndroid Build Coastguard Worker }
130*49cdfc7eSAndroid Build Coastguard Worker 
safe_pidfd_open(const char * file,const int lineno,pid_t pid,unsigned int flags)131*49cdfc7eSAndroid Build Coastguard Worker int safe_pidfd_open(const char *file, const int lineno, pid_t pid,
132*49cdfc7eSAndroid Build Coastguard Worker 		   unsigned int flags)
133*49cdfc7eSAndroid Build Coastguard Worker {
134*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
135*49cdfc7eSAndroid Build Coastguard Worker 
136*49cdfc7eSAndroid Build Coastguard Worker 	rval = pidfd_open(pid, flags);
137*49cdfc7eSAndroid Build Coastguard Worker 
138*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
139*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
140*49cdfc7eSAndroid Build Coastguard Worker 			 "pidfd_open(%i, %i) failed", pid, flags);
141*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
142*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
143*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid pidfd_open(%i, %i) return value %d",
144*49cdfc7eSAndroid Build Coastguard Worker 			 pid, flags, rval);
145*49cdfc7eSAndroid Build Coastguard Worker 	}
146*49cdfc7eSAndroid Build Coastguard Worker 
147*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
148*49cdfc7eSAndroid Build Coastguard Worker }
149*49cdfc7eSAndroid Build Coastguard Worker 
safe_setregid(const char * file,const int lineno,gid_t rgid,gid_t egid)150*49cdfc7eSAndroid Build Coastguard Worker int safe_setregid(const char *file, const int lineno,
151*49cdfc7eSAndroid Build Coastguard Worker 		  gid_t rgid, gid_t egid)
152*49cdfc7eSAndroid Build Coastguard Worker {
153*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
154*49cdfc7eSAndroid Build Coastguard Worker 
155*49cdfc7eSAndroid Build Coastguard Worker 	rval = setregid(rgid, egid);
156*49cdfc7eSAndroid Build Coastguard Worker 
157*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
158*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
159*49cdfc7eSAndroid Build Coastguard Worker 			 "setregid(%li, %li) failed", (long)rgid, (long)egid);
160*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
161*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
162*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid setregid(%li, %li) return value %d",
163*49cdfc7eSAndroid Build Coastguard Worker 			 (long)rgid, (long)egid, rval);
164*49cdfc7eSAndroid Build Coastguard Worker 	}
165*49cdfc7eSAndroid Build Coastguard Worker 
166*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
167*49cdfc7eSAndroid Build Coastguard Worker }
168*49cdfc7eSAndroid Build Coastguard Worker 
safe_setreuid(const char * file,const int lineno,uid_t ruid,uid_t euid)169*49cdfc7eSAndroid Build Coastguard Worker int safe_setreuid(const char *file, const int lineno,
170*49cdfc7eSAndroid Build Coastguard Worker 		  uid_t ruid, uid_t euid)
171*49cdfc7eSAndroid Build Coastguard Worker {
172*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
173*49cdfc7eSAndroid Build Coastguard Worker 
174*49cdfc7eSAndroid Build Coastguard Worker 	rval = setreuid(ruid, euid);
175*49cdfc7eSAndroid Build Coastguard Worker 
176*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
177*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
178*49cdfc7eSAndroid Build Coastguard Worker 			 "setreuid(%li, %li) failed", (long)ruid, (long)euid);
179*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
180*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
181*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid setreuid(%li, %li) return value %d",
182*49cdfc7eSAndroid Build Coastguard Worker 			 (long)ruid, (long)euid, rval);
183*49cdfc7eSAndroid Build Coastguard Worker 	}
184*49cdfc7eSAndroid Build Coastguard Worker 
185*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
186*49cdfc7eSAndroid Build Coastguard Worker }
187*49cdfc7eSAndroid Build Coastguard Worker 
safe_setresgid(const char * file,const int lineno,gid_t rgid,gid_t egid,gid_t sgid)188*49cdfc7eSAndroid Build Coastguard Worker int safe_setresgid(const char *file, const int lineno,
189*49cdfc7eSAndroid Build Coastguard Worker 	gid_t rgid, gid_t egid, gid_t sgid)
190*49cdfc7eSAndroid Build Coastguard Worker {
191*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
192*49cdfc7eSAndroid Build Coastguard Worker 
193*49cdfc7eSAndroid Build Coastguard Worker 	ret = setresgid(rgid, egid, sgid);
194*49cdfc7eSAndroid Build Coastguard Worker 
195*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
196*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
197*49cdfc7eSAndroid Build Coastguard Worker 			"setregid(%li, %li, %li) failed", (long)rgid,
198*49cdfc7eSAndroid Build Coastguard Worker 			(long)egid, (long)sgid);
199*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
200*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
201*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setregid(%li, %li, %li) return value %d",
202*49cdfc7eSAndroid Build Coastguard Worker 			(long)rgid, (long)egid, (long)sgid, ret);
203*49cdfc7eSAndroid Build Coastguard Worker 	}
204*49cdfc7eSAndroid Build Coastguard Worker 
205*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
206*49cdfc7eSAndroid Build Coastguard Worker }
207*49cdfc7eSAndroid Build Coastguard Worker 
safe_setresuid(const char * file,const int lineno,uid_t ruid,uid_t euid,uid_t suid)208*49cdfc7eSAndroid Build Coastguard Worker int safe_setresuid(const char *file, const int lineno,
209*49cdfc7eSAndroid Build Coastguard Worker 	uid_t ruid, uid_t euid, uid_t suid)
210*49cdfc7eSAndroid Build Coastguard Worker {
211*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
212*49cdfc7eSAndroid Build Coastguard Worker 
213*49cdfc7eSAndroid Build Coastguard Worker 	ret = setresuid(ruid, euid, suid);
214*49cdfc7eSAndroid Build Coastguard Worker 
215*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
216*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
217*49cdfc7eSAndroid Build Coastguard Worker 			"setreuid(%li, %li, %li) failed", (long)ruid,
218*49cdfc7eSAndroid Build Coastguard Worker 			(long)euid, (long)suid);
219*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
220*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
221*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setreuid(%li, %li, %li) return value %d",
222*49cdfc7eSAndroid Build Coastguard Worker 			(long)ruid, (long)euid, (long)suid, ret);
223*49cdfc7eSAndroid Build Coastguard Worker 	}
224*49cdfc7eSAndroid Build Coastguard Worker 
225*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
226*49cdfc7eSAndroid Build Coastguard Worker }
227*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigaction(const char * file,const int lineno,int signum,const struct sigaction * act,struct sigaction * oldact)228*49cdfc7eSAndroid Build Coastguard Worker int safe_sigaction(const char *file, const int lineno,
229*49cdfc7eSAndroid Build Coastguard Worker 				   int signum, const struct sigaction *act,
230*49cdfc7eSAndroid Build Coastguard Worker 				   struct sigaction *oldact)
231*49cdfc7eSAndroid Build Coastguard Worker {
232*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
233*49cdfc7eSAndroid Build Coastguard Worker 
234*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigaction(signum, act, oldact);
235*49cdfc7eSAndroid Build Coastguard Worker 
236*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
237*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
238*49cdfc7eSAndroid Build Coastguard Worker 			"sigaction(%s (%d), %p, %p) failed",
239*49cdfc7eSAndroid Build Coastguard Worker 			tst_strsig(signum), signum, act, oldact);
240*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
241*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
242*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigaction(%s (%d), %p, %p) return value %d",
243*49cdfc7eSAndroid Build Coastguard Worker 			tst_strsig(signum), signum, act, oldact, rval);
244*49cdfc7eSAndroid Build Coastguard Worker 	}
245*49cdfc7eSAndroid Build Coastguard Worker 
246*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
247*49cdfc7eSAndroid Build Coastguard Worker }
248*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigaddset(const char * file,const int lineno,sigset_t * sigs,int signo)249*49cdfc7eSAndroid Build Coastguard Worker int safe_sigaddset(const char *file, const int lineno,
250*49cdfc7eSAndroid Build Coastguard Worker 				   sigset_t *sigs, int signo)
251*49cdfc7eSAndroid Build Coastguard Worker {
252*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
253*49cdfc7eSAndroid Build Coastguard Worker 
254*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigaddset(sigs, signo);
255*49cdfc7eSAndroid Build Coastguard Worker 
256*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
257*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
258*49cdfc7eSAndroid Build Coastguard Worker 			"sigaddset() %s (%i) failed", tst_strsig(signo),
259*49cdfc7eSAndroid Build Coastguard Worker 			signo);
260*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
261*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
262*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigaddset() %s (%i) return value %d",
263*49cdfc7eSAndroid Build Coastguard Worker 			tst_strsig(signo), signo, rval);
264*49cdfc7eSAndroid Build Coastguard Worker 	}
265*49cdfc7eSAndroid Build Coastguard Worker 
266*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
267*49cdfc7eSAndroid Build Coastguard Worker }
268*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigdelset(const char * file,const int lineno,sigset_t * sigs,int signo)269*49cdfc7eSAndroid Build Coastguard Worker int safe_sigdelset(const char *file, const int lineno, sigset_t *sigs, int signo)
270*49cdfc7eSAndroid Build Coastguard Worker {
271*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
272*49cdfc7eSAndroid Build Coastguard Worker 
273*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigdelset(sigs, signo);
274*49cdfc7eSAndroid Build Coastguard Worker 
275*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
276*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
277*49cdfc7eSAndroid Build Coastguard Worker 			"sigdelset() %s (%i) failed", tst_strsig(signo),
278*49cdfc7eSAndroid Build Coastguard Worker 			signo);
279*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
280*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
281*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigdelset() %s (%i) return value %d",
282*49cdfc7eSAndroid Build Coastguard Worker 			tst_strsig(signo), signo, rval);
283*49cdfc7eSAndroid Build Coastguard Worker 	}
284*49cdfc7eSAndroid Build Coastguard Worker 
285*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
286*49cdfc7eSAndroid Build Coastguard Worker }
287*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigemptyset(const char * file,const int lineno,sigset_t * sigs)288*49cdfc7eSAndroid Build Coastguard Worker int safe_sigemptyset(const char *file, const int lineno, sigset_t *sigs)
289*49cdfc7eSAndroid Build Coastguard Worker {
290*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
291*49cdfc7eSAndroid Build Coastguard Worker 
292*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigemptyset(sigs);
293*49cdfc7eSAndroid Build Coastguard Worker 
294*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
295*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "sigemptyset() failed");
296*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
297*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
298*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigemptyset() return value %d", rval);
299*49cdfc7eSAndroid Build Coastguard Worker 	}
300*49cdfc7eSAndroid Build Coastguard Worker 
301*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
302*49cdfc7eSAndroid Build Coastguard Worker }
303*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigfillset(const char * file,const int lineno,sigset_t * sigs)304*49cdfc7eSAndroid Build Coastguard Worker int safe_sigfillset(const char *file, const int lineno,
305*49cdfc7eSAndroid Build Coastguard Worker 		     sigset_t *sigs)
306*49cdfc7eSAndroid Build Coastguard Worker {
307*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
308*49cdfc7eSAndroid Build Coastguard Worker 
309*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigfillset(sigs);
310*49cdfc7eSAndroid Build Coastguard Worker 
311*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
312*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "sigfillset() failed");
313*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
314*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
315*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigfillset() return value %d", rval);
316*49cdfc7eSAndroid Build Coastguard Worker 	}
317*49cdfc7eSAndroid Build Coastguard Worker 
318*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
319*49cdfc7eSAndroid Build Coastguard Worker }
320*49cdfc7eSAndroid Build Coastguard Worker 
strhow(int how)321*49cdfc7eSAndroid Build Coastguard Worker static const char *strhow(int how)
322*49cdfc7eSAndroid Build Coastguard Worker {
323*49cdfc7eSAndroid Build Coastguard Worker 	switch (how) {
324*49cdfc7eSAndroid Build Coastguard Worker 	case SIG_BLOCK:
325*49cdfc7eSAndroid Build Coastguard Worker 		return "SIG_BLOCK";
326*49cdfc7eSAndroid Build Coastguard Worker 	case SIG_UNBLOCK:
327*49cdfc7eSAndroid Build Coastguard Worker 		return "SIG_UNBLOCK";
328*49cdfc7eSAndroid Build Coastguard Worker 	case SIG_SETMASK:
329*49cdfc7eSAndroid Build Coastguard Worker 		return "SIG_SETMASK";
330*49cdfc7eSAndroid Build Coastguard Worker 	default:
331*49cdfc7eSAndroid Build Coastguard Worker 		return "???";
332*49cdfc7eSAndroid Build Coastguard Worker 	}
333*49cdfc7eSAndroid Build Coastguard Worker }
334*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigprocmask(const char * file,const int lineno,int how,sigset_t * set,sigset_t * oldset)335*49cdfc7eSAndroid Build Coastguard Worker int safe_sigprocmask(const char *file, const int lineno,
336*49cdfc7eSAndroid Build Coastguard Worker 					 int how, sigset_t *set, sigset_t *oldset)
337*49cdfc7eSAndroid Build Coastguard Worker {
338*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
339*49cdfc7eSAndroid Build Coastguard Worker 
340*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigprocmask(how, set, oldset);
341*49cdfc7eSAndroid Build Coastguard Worker 
342*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
343*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
344*49cdfc7eSAndroid Build Coastguard Worker 			"sigprocmask(%s, %p, %p) failed", strhow(how), set,
345*49cdfc7eSAndroid Build Coastguard Worker 			oldset);
346*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
347*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
348*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigprocmask(%s, %p, %p) return value %d",
349*49cdfc7eSAndroid Build Coastguard Worker 			strhow(how), set, oldset, rval);
350*49cdfc7eSAndroid Build Coastguard Worker 	}
351*49cdfc7eSAndroid Build Coastguard Worker 
352*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
353*49cdfc7eSAndroid Build Coastguard Worker }
354*49cdfc7eSAndroid Build Coastguard Worker 
safe_sigwait(const char * file,const int lineno,sigset_t * set,int * sig)355*49cdfc7eSAndroid Build Coastguard Worker int safe_sigwait(const char *file, const int lineno, sigset_t *set, int *sig)
356*49cdfc7eSAndroid Build Coastguard Worker {
357*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
358*49cdfc7eSAndroid Build Coastguard Worker 
359*49cdfc7eSAndroid Build Coastguard Worker 	rval = sigwait(set, sig);
360*49cdfc7eSAndroid Build Coastguard Worker 
361*49cdfc7eSAndroid Build Coastguard Worker 	if (rval > 0) {
362*49cdfc7eSAndroid Build Coastguard Worker 		errno = rval;
363*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
364*49cdfc7eSAndroid Build Coastguard Worker 			"sigwait(%p, %p) failed", set, sig);
365*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
366*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK,
367*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid sigwait(%p, %p) return value %d", set, sig,
368*49cdfc7eSAndroid Build Coastguard Worker 			rval);
369*49cdfc7eSAndroid Build Coastguard Worker 	}
370*49cdfc7eSAndroid Build Coastguard Worker 
371*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
372*49cdfc7eSAndroid Build Coastguard Worker }
373*49cdfc7eSAndroid Build Coastguard Worker 
safe_getgrnam(const char * file,const int lineno,const char * name)374*49cdfc7eSAndroid Build Coastguard Worker struct group *safe_getgrnam(const char *file, const int lineno,
375*49cdfc7eSAndroid Build Coastguard Worker 			    const char *name)
376*49cdfc7eSAndroid Build Coastguard Worker {
377*49cdfc7eSAndroid Build Coastguard Worker 	struct group *rval;
378*49cdfc7eSAndroid Build Coastguard Worker 
379*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
380*49cdfc7eSAndroid Build Coastguard Worker 	rval = getgrnam(name);
381*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
382*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
383*49cdfc7eSAndroid Build Coastguard Worker 			"getgrnam(%s) failed", name);
384*49cdfc7eSAndroid Build Coastguard Worker 	}
385*49cdfc7eSAndroid Build Coastguard Worker 
386*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
387*49cdfc7eSAndroid Build Coastguard Worker }
388*49cdfc7eSAndroid Build Coastguard Worker 
safe_getgrnam_fallback(const char * file,const int lineno,const char * name,const char * fallback)389*49cdfc7eSAndroid Build Coastguard Worker struct group *safe_getgrnam_fallback(const char *file, const int lineno,
390*49cdfc7eSAndroid Build Coastguard Worker 				     const char *name, const char *fallback)
391*49cdfc7eSAndroid Build Coastguard Worker {
392*49cdfc7eSAndroid Build Coastguard Worker 	struct group *rval;
393*49cdfc7eSAndroid Build Coastguard Worker 
394*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
395*49cdfc7eSAndroid Build Coastguard Worker 	rval = getgrnam(name);
396*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
397*49cdfc7eSAndroid Build Coastguard Worker 		tst_res_(file, lineno, TINFO,
398*49cdfc7eSAndroid Build Coastguard Worker 			 "getgrnam(%s) failed - try fallback %s",
399*49cdfc7eSAndroid Build Coastguard Worker 			 name, fallback);
400*49cdfc7eSAndroid Build Coastguard Worker 		rval = safe_getgrnam(file, lineno, fallback);
401*49cdfc7eSAndroid Build Coastguard Worker 	}
402*49cdfc7eSAndroid Build Coastguard Worker 
403*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
404*49cdfc7eSAndroid Build Coastguard Worker }
405*49cdfc7eSAndroid Build Coastguard Worker 
safe_getgrgid(const char * file,const int lineno,gid_t gid)406*49cdfc7eSAndroid Build Coastguard Worker struct group *safe_getgrgid(const char *file, const int lineno, gid_t gid)
407*49cdfc7eSAndroid Build Coastguard Worker {
408*49cdfc7eSAndroid Build Coastguard Worker 	struct group *rval;
409*49cdfc7eSAndroid Build Coastguard Worker 
410*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
411*49cdfc7eSAndroid Build Coastguard Worker 	rval = getgrgid(gid);
412*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
413*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
414*49cdfc7eSAndroid Build Coastguard Worker 			"getgrgid(%li) failed", (long)gid);
415*49cdfc7eSAndroid Build Coastguard Worker 	}
416*49cdfc7eSAndroid Build Coastguard Worker 
417*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
418*49cdfc7eSAndroid Build Coastguard Worker }
419*49cdfc7eSAndroid Build Coastguard Worker 
safe_chroot(const char * file,const int lineno,const char * path)420*49cdfc7eSAndroid Build Coastguard Worker int safe_chroot(const char *file, const int lineno, const char *path)
421*49cdfc7eSAndroid Build Coastguard Worker {
422*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
423*49cdfc7eSAndroid Build Coastguard Worker 
424*49cdfc7eSAndroid Build Coastguard Worker 	rval = chroot(path);
425*49cdfc7eSAndroid Build Coastguard Worker 
426*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
427*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "chroot(%s) failed",
428*49cdfc7eSAndroid Build Coastguard Worker 			path);
429*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
430*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
431*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid chroot(%s) return value %d", path, rval);
432*49cdfc7eSAndroid Build Coastguard Worker 	}
433*49cdfc7eSAndroid Build Coastguard Worker 
434*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
435*49cdfc7eSAndroid Build Coastguard Worker }
436*49cdfc7eSAndroid Build Coastguard Worker 
safe_unshare(const char * file,const int lineno,int flags)437*49cdfc7eSAndroid Build Coastguard Worker int safe_unshare(const char *file, const int lineno, int flags)
438*49cdfc7eSAndroid Build Coastguard Worker {
439*49cdfc7eSAndroid Build Coastguard Worker 	int res;
440*49cdfc7eSAndroid Build Coastguard Worker 
441*49cdfc7eSAndroid Build Coastguard Worker 	res = unshare(flags);
442*49cdfc7eSAndroid Build Coastguard Worker 
443*49cdfc7eSAndroid Build Coastguard Worker 	if (res == -1) {
444*49cdfc7eSAndroid Build Coastguard Worker 		if (errno == EINVAL) {
445*49cdfc7eSAndroid Build Coastguard Worker 			tst_brk_(file, lineno, TCONF | TERRNO,
446*49cdfc7eSAndroid Build Coastguard Worker 				 "unshare(%d) unsupported", flags);
447*49cdfc7eSAndroid Build Coastguard Worker 		} else {
448*49cdfc7eSAndroid Build Coastguard Worker 			tst_brk_(file, lineno, TBROK | TERRNO,
449*49cdfc7eSAndroid Build Coastguard Worker 				 "unshare(%d) failed", flags);
450*49cdfc7eSAndroid Build Coastguard Worker 		}
451*49cdfc7eSAndroid Build Coastguard Worker 	} else if (res) {
452*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
453*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid unshare(%d) return value %d", flags, res);
454*49cdfc7eSAndroid Build Coastguard Worker 	}
455*49cdfc7eSAndroid Build Coastguard Worker 
456*49cdfc7eSAndroid Build Coastguard Worker 	return res;
457*49cdfc7eSAndroid Build Coastguard Worker }
458*49cdfc7eSAndroid Build Coastguard Worker 
safe_setns(const char * file,const int lineno,int fd,int nstype)459*49cdfc7eSAndroid Build Coastguard Worker int safe_setns(const char *file, const int lineno, int fd, int nstype)
460*49cdfc7eSAndroid Build Coastguard Worker {
461*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
462*49cdfc7eSAndroid Build Coastguard Worker 
463*49cdfc7eSAndroid Build Coastguard Worker 	ret = setns(fd, nstype);
464*49cdfc7eSAndroid Build Coastguard Worker 
465*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
466*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "setns(%i, %i) failed",
467*49cdfc7eSAndroid Build Coastguard Worker 			fd, nstype);
468*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
469*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
470*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid setns(%i, %i) return value %d", fd, nstype,
471*49cdfc7eSAndroid Build Coastguard Worker 			ret);
472*49cdfc7eSAndroid Build Coastguard Worker 	}
473*49cdfc7eSAndroid Build Coastguard Worker 
474*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
475*49cdfc7eSAndroid Build Coastguard Worker }
476*49cdfc7eSAndroid Build Coastguard Worker 
tst_safe_ptrace(const char * file,const int lineno,int req,pid_t pid,void * addr,void * data)477*49cdfc7eSAndroid Build Coastguard Worker long tst_safe_ptrace(const char *file, const int lineno, int req, pid_t pid,
478*49cdfc7eSAndroid Build Coastguard Worker 	void *addr, void *data)
479*49cdfc7eSAndroid Build Coastguard Worker {
480*49cdfc7eSAndroid Build Coastguard Worker 	long ret;
481*49cdfc7eSAndroid Build Coastguard Worker 
482*49cdfc7eSAndroid Build Coastguard Worker 	errno = 0;
483*49cdfc7eSAndroid Build Coastguard Worker 	ret = ptrace(req, pid, addr, data);
484*49cdfc7eSAndroid Build Coastguard Worker 
485*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
486*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "ptrace() failed");
487*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
488*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
489*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid ptrace() return value %ld", ret);
490*49cdfc7eSAndroid Build Coastguard Worker 	}
491*49cdfc7eSAndroid Build Coastguard Worker 
492*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
493*49cdfc7eSAndroid Build Coastguard Worker }
494*49cdfc7eSAndroid Build Coastguard Worker 
safe_pipe2(const char * file,const int lineno,int fildes[2],int flags)495*49cdfc7eSAndroid Build Coastguard Worker int safe_pipe2(const char *file, const int lineno, int fildes[2], int flags)
496*49cdfc7eSAndroid Build Coastguard Worker {
497*49cdfc7eSAndroid Build Coastguard Worker 	int ret;
498*49cdfc7eSAndroid Build Coastguard Worker 
499*49cdfc7eSAndroid Build Coastguard Worker 	ret = pipe2(fildes, flags);
500*49cdfc7eSAndroid Build Coastguard Worker 
501*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == -1) {
502*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
503*49cdfc7eSAndroid Build Coastguard Worker 			"pipe2({%d,%d}) failed with flag(%d)", fildes[0],
504*49cdfc7eSAndroid Build Coastguard Worker 			fildes[1], flags);
505*49cdfc7eSAndroid Build Coastguard Worker 	} else if (ret) {
506*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
507*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid pipe2({%d,%d}, %d) return value %d",
508*49cdfc7eSAndroid Build Coastguard Worker 			fildes[0], fildes[1], flags, ret);
509*49cdfc7eSAndroid Build Coastguard Worker 	}
510*49cdfc7eSAndroid Build Coastguard Worker 
511*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
512*49cdfc7eSAndroid Build Coastguard Worker }
513*49cdfc7eSAndroid Build Coastguard Worker 
safe_dup(const char * file,const int lineno,int oldfd)514*49cdfc7eSAndroid Build Coastguard Worker int safe_dup(const char *file, const int lineno, int oldfd)
515*49cdfc7eSAndroid Build Coastguard Worker {
516*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
517*49cdfc7eSAndroid Build Coastguard Worker 
518*49cdfc7eSAndroid Build Coastguard Worker 	rval = dup(oldfd);
519*49cdfc7eSAndroid Build Coastguard Worker 
520*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
521*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
522*49cdfc7eSAndroid Build Coastguard Worker 			"dup(%i) failed", oldfd);
523*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval < 0) {
524*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
525*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid dup(%i) return value %d", oldfd, rval);
526*49cdfc7eSAndroid Build Coastguard Worker 	}
527*49cdfc7eSAndroid Build Coastguard Worker 
528*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
529*49cdfc7eSAndroid Build Coastguard Worker }
530*49cdfc7eSAndroid Build Coastguard Worker 
safe_dup2(const char * file,const int lineno,int oldfd,int newfd)531*49cdfc7eSAndroid Build Coastguard Worker int safe_dup2(const char *file, const int lineno, int oldfd, int newfd)
532*49cdfc7eSAndroid Build Coastguard Worker {
533*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
534*49cdfc7eSAndroid Build Coastguard Worker 
535*49cdfc7eSAndroid Build Coastguard Worker 	rval = dup2(oldfd, newfd);
536*49cdfc7eSAndroid Build Coastguard Worker 
537*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
538*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
539*49cdfc7eSAndroid Build Coastguard Worker 			 "dup2(%i, %i) failed", oldfd, newfd);
540*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval != newfd) {
541*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
542*49cdfc7eSAndroid Build Coastguard Worker 			 "Invalid dup2(%i, %i) return value %d",
543*49cdfc7eSAndroid Build Coastguard Worker 			 oldfd, newfd, rval);
544*49cdfc7eSAndroid Build Coastguard Worker 	}
545*49cdfc7eSAndroid Build Coastguard Worker 
546*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
547*49cdfc7eSAndroid Build Coastguard Worker }
548*49cdfc7eSAndroid Build Coastguard Worker 
safe_calloc(const char * file,const int lineno,size_t nmemb,size_t size)549*49cdfc7eSAndroid Build Coastguard Worker void *safe_calloc(const char *file, const int lineno, size_t nmemb, size_t size)
550*49cdfc7eSAndroid Build Coastguard Worker {
551*49cdfc7eSAndroid Build Coastguard Worker 	void *rval;
552*49cdfc7eSAndroid Build Coastguard Worker 
553*49cdfc7eSAndroid Build Coastguard Worker 	rval = calloc(nmemb, size);
554*49cdfc7eSAndroid Build Coastguard Worker 
555*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == NULL) {
556*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
557*49cdfc7eSAndroid Build Coastguard Worker 			"calloc(%zu, %zu) failed", nmemb, size);
558*49cdfc7eSAndroid Build Coastguard Worker 	}
559*49cdfc7eSAndroid Build Coastguard Worker 
560*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
561*49cdfc7eSAndroid Build Coastguard Worker }
562*49cdfc7eSAndroid Build Coastguard Worker 
safe_realloc(const char * file,const int lineno,void * ptr,size_t size)563*49cdfc7eSAndroid Build Coastguard Worker void *safe_realloc(const char *file, const int lineno, void *ptr, size_t size)
564*49cdfc7eSAndroid Build Coastguard Worker {
565*49cdfc7eSAndroid Build Coastguard Worker 	void *ret;
566*49cdfc7eSAndroid Build Coastguard Worker 
567*49cdfc7eSAndroid Build Coastguard Worker 	ret = realloc(ptr, size);
568*49cdfc7eSAndroid Build Coastguard Worker 
569*49cdfc7eSAndroid Build Coastguard Worker 	if (!ret) {
570*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
571*49cdfc7eSAndroid Build Coastguard Worker 			"realloc(%p, %zu) failed", ptr, size);
572*49cdfc7eSAndroid Build Coastguard Worker 	}
573*49cdfc7eSAndroid Build Coastguard Worker 
574*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
575*49cdfc7eSAndroid Build Coastguard Worker }
576*49cdfc7eSAndroid Build Coastguard Worker 
safe_signal(const char * file,const int lineno,int signum,sighandler_t handler)577*49cdfc7eSAndroid Build Coastguard Worker sighandler_t safe_signal(const char *file, const int lineno,
578*49cdfc7eSAndroid Build Coastguard Worker 	int signum, sighandler_t handler)
579*49cdfc7eSAndroid Build Coastguard Worker {
580*49cdfc7eSAndroid Build Coastguard Worker 	sighandler_t rval;
581*49cdfc7eSAndroid Build Coastguard Worker 
582*49cdfc7eSAndroid Build Coastguard Worker 	rval = signal(signum, handler);
583*49cdfc7eSAndroid Build Coastguard Worker 
584*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == SIG_ERR) {
585*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
586*49cdfc7eSAndroid Build Coastguard Worker 			"signal(%d,%p) failed",
587*49cdfc7eSAndroid Build Coastguard Worker 			signum, handler);
588*49cdfc7eSAndroid Build Coastguard Worker 	}
589*49cdfc7eSAndroid Build Coastguard Worker 
590*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
591*49cdfc7eSAndroid Build Coastguard Worker }
592*49cdfc7eSAndroid Build Coastguard Worker 
safe_cmd(const char * file,const int lineno,const char * const argv[],const char * stdout_path,const char * stderr_path)593*49cdfc7eSAndroid Build Coastguard Worker void safe_cmd(const char *file, const int lineno, const char *const argv[],
594*49cdfc7eSAndroid Build Coastguard Worker 	const char *stdout_path, const char *stderr_path)
595*49cdfc7eSAndroid Build Coastguard Worker {
596*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
597*49cdfc7eSAndroid Build Coastguard Worker 
598*49cdfc7eSAndroid Build Coastguard Worker 	switch ((rval = tst_cmd(argv, stdout_path, stderr_path,
599*49cdfc7eSAndroid Build Coastguard Worker 		TST_CMD_PASS_RETVAL | TST_CMD_TCONF_ON_MISSING))) {
600*49cdfc7eSAndroid Build Coastguard Worker 	case 0:
601*49cdfc7eSAndroid Build Coastguard Worker 		break;
602*49cdfc7eSAndroid Build Coastguard Worker 	default:
603*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK, "%s failed (%d)", argv[0], rval);
604*49cdfc7eSAndroid Build Coastguard Worker 	}
605*49cdfc7eSAndroid Build Coastguard Worker }
606*49cdfc7eSAndroid Build Coastguard Worker 
safe_msync(const char * file,const int lineno,void * addr,size_t length,int flags)607*49cdfc7eSAndroid Build Coastguard Worker int safe_msync(const char *file, const int lineno, void *addr,
608*49cdfc7eSAndroid Build Coastguard Worker 				size_t length, int flags)
609*49cdfc7eSAndroid Build Coastguard Worker {
610*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
611*49cdfc7eSAndroid Build Coastguard Worker 
612*49cdfc7eSAndroid Build Coastguard Worker 	rval = msync(addr, length, flags);
613*49cdfc7eSAndroid Build Coastguard Worker 
614*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
615*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
616*49cdfc7eSAndroid Build Coastguard Worker 			"msync(%p, %zu, %d) failed", addr, length, flags);
617*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
618*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
619*49cdfc7eSAndroid Build Coastguard Worker 			"Invalid msync(%p, %zu, %d) return value %d",
620*49cdfc7eSAndroid Build Coastguard Worker 			addr, length, flags, rval);
621*49cdfc7eSAndroid Build Coastguard Worker 	}
622*49cdfc7eSAndroid Build Coastguard Worker 
623*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
624*49cdfc7eSAndroid Build Coastguard Worker }
625*49cdfc7eSAndroid Build Coastguard Worker 
safe_print_file(const char * file,const int lineno,char * path)626*49cdfc7eSAndroid Build Coastguard Worker void safe_print_file(const char *file, const int lineno, char *path)
627*49cdfc7eSAndroid Build Coastguard Worker {
628*49cdfc7eSAndroid Build Coastguard Worker 	FILE *pfile;
629*49cdfc7eSAndroid Build Coastguard Worker 	char line[PATH_MAX];
630*49cdfc7eSAndroid Build Coastguard Worker 
631*49cdfc7eSAndroid Build Coastguard Worker 	tst_res(TINFO, "=== %s ===", path);
632*49cdfc7eSAndroid Build Coastguard Worker 
633*49cdfc7eSAndroid Build Coastguard Worker 	pfile = safe_fopen(file, lineno, NULL, path, "r");
634*49cdfc7eSAndroid Build Coastguard Worker 
635*49cdfc7eSAndroid Build Coastguard Worker 	while (fgets(line, sizeof(line), pfile))
636*49cdfc7eSAndroid Build Coastguard Worker 		fprintf(stderr, "%s", line);
637*49cdfc7eSAndroid Build Coastguard Worker 
638*49cdfc7eSAndroid Build Coastguard Worker 	safe_fclose(file, lineno, NULL, pfile);
639*49cdfc7eSAndroid Build Coastguard Worker }
640*49cdfc7eSAndroid Build Coastguard Worker 
safe_sscanf(const char * file,const int lineno,const char * restrict buffer,const char * restrict format,...)641*49cdfc7eSAndroid Build Coastguard Worker int safe_sscanf(const char *file, const int lineno, const char *restrict buffer, const char *restrict format, ...)
642*49cdfc7eSAndroid Build Coastguard Worker {
643*49cdfc7eSAndroid Build Coastguard Worker 	va_list args;
644*49cdfc7eSAndroid Build Coastguard Worker 
645*49cdfc7eSAndroid Build Coastguard Worker 	va_start(args, format);
646*49cdfc7eSAndroid Build Coastguard Worker 	int ret = vsscanf(buffer, format, args);
647*49cdfc7eSAndroid Build Coastguard Worker 
648*49cdfc7eSAndroid Build Coastguard Worker 	va_end(args);
649*49cdfc7eSAndroid Build Coastguard Worker 	int placeholders = tst_count_scanf_conversions(format);
650*49cdfc7eSAndroid Build Coastguard Worker 
651*49cdfc7eSAndroid Build Coastguard Worker 	if (ret == EOF)
652*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "got EOF from sscanf()");
653*49cdfc7eSAndroid Build Coastguard Worker 
654*49cdfc7eSAndroid Build Coastguard Worker 	if (ret != placeholders)
655*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO, "wrong number of conversion, expected %d, got %d", placeholders, ret);
656*49cdfc7eSAndroid Build Coastguard Worker 
657*49cdfc7eSAndroid Build Coastguard Worker 	return ret;
658*49cdfc7eSAndroid Build Coastguard Worker }
659*49cdfc7eSAndroid Build Coastguard Worker 
660*49cdfc7eSAndroid Build Coastguard Worker #define PROT_FLAG_STR(f) #f " | "
tst_prot_to_str(const int prot,char * buf)661*49cdfc7eSAndroid Build Coastguard Worker void tst_prot_to_str(const int prot, char *buf)
662*49cdfc7eSAndroid Build Coastguard Worker {
663*49cdfc7eSAndroid Build Coastguard Worker 	char *ptr = buf;
664*49cdfc7eSAndroid Build Coastguard Worker 
665*49cdfc7eSAndroid Build Coastguard Worker 	if (prot == PROT_NONE) {
666*49cdfc7eSAndroid Build Coastguard Worker 		strcpy(buf, "PROT_NONE");
667*49cdfc7eSAndroid Build Coastguard Worker 		return;
668*49cdfc7eSAndroid Build Coastguard Worker 	}
669*49cdfc7eSAndroid Build Coastguard Worker 
670*49cdfc7eSAndroid Build Coastguard Worker 	if (prot & PROT_READ) {
671*49cdfc7eSAndroid Build Coastguard Worker 		strcpy(ptr, PROT_FLAG_STR(PROT_READ));
672*49cdfc7eSAndroid Build Coastguard Worker 		ptr += sizeof(PROT_FLAG_STR(PROT_READ)) - 1;
673*49cdfc7eSAndroid Build Coastguard Worker 	}
674*49cdfc7eSAndroid Build Coastguard Worker 
675*49cdfc7eSAndroid Build Coastguard Worker 	if (prot & PROT_WRITE) {
676*49cdfc7eSAndroid Build Coastguard Worker 		strcpy(ptr, PROT_FLAG_STR(PROT_WRITE));
677*49cdfc7eSAndroid Build Coastguard Worker 		ptr += sizeof(PROT_FLAG_STR(PROT_WRITE)) - 1;
678*49cdfc7eSAndroid Build Coastguard Worker 	}
679*49cdfc7eSAndroid Build Coastguard Worker 
680*49cdfc7eSAndroid Build Coastguard Worker 	if (prot & PROT_EXEC) {
681*49cdfc7eSAndroid Build Coastguard Worker 		strcpy(ptr, PROT_FLAG_STR(PROT_EXEC));
682*49cdfc7eSAndroid Build Coastguard Worker 		ptr += sizeof(PROT_FLAG_STR(PROT_EXEC)) - 1;
683*49cdfc7eSAndroid Build Coastguard Worker 	}
684*49cdfc7eSAndroid Build Coastguard Worker 
685*49cdfc7eSAndroid Build Coastguard Worker 	if (buf != ptr)
686*49cdfc7eSAndroid Build Coastguard Worker 		ptr[-3] = 0;
687*49cdfc7eSAndroid Build Coastguard Worker }
688*49cdfc7eSAndroid Build Coastguard Worker 
safe_mprotect(const char * file,const int lineno,char * addr,size_t len,int prot)689*49cdfc7eSAndroid Build Coastguard Worker int safe_mprotect(const char *file, const int lineno,
690*49cdfc7eSAndroid Build Coastguard Worker 	char *addr, size_t len, int prot)
691*49cdfc7eSAndroid Build Coastguard Worker {
692*49cdfc7eSAndroid Build Coastguard Worker 	int rval;
693*49cdfc7eSAndroid Build Coastguard Worker 	char prot_buf[512];
694*49cdfc7eSAndroid Build Coastguard Worker 
695*49cdfc7eSAndroid Build Coastguard Worker 	tst_prot_to_str(prot, prot_buf);
696*49cdfc7eSAndroid Build Coastguard Worker 
697*49cdfc7eSAndroid Build Coastguard Worker 	tst_res_(file, lineno, TDEBUG,
698*49cdfc7eSAndroid Build Coastguard Worker 		"mprotect(%p, %ld, %s(%x))", addr, len, prot_buf, prot);
699*49cdfc7eSAndroid Build Coastguard Worker 
700*49cdfc7eSAndroid Build Coastguard Worker 	rval = mprotect(addr, len, prot);
701*49cdfc7eSAndroid Build Coastguard Worker 
702*49cdfc7eSAndroid Build Coastguard Worker 	if (rval == -1) {
703*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
704*49cdfc7eSAndroid Build Coastguard Worker 			"mprotect(%p, %ld, %s(%x))", addr, len, prot_buf, prot);
705*49cdfc7eSAndroid Build Coastguard Worker 	} else if (rval) {
706*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk_(file, lineno, TBROK | TERRNO,
707*49cdfc7eSAndroid Build Coastguard Worker 			"mprotect(%p, %ld, %s(%x)) return value %d",
708*49cdfc7eSAndroid Build Coastguard Worker 			addr, len, prot_buf, prot, rval);
709*49cdfc7eSAndroid Build Coastguard Worker 	}
710*49cdfc7eSAndroid Build Coastguard Worker 
711*49cdfc7eSAndroid Build Coastguard Worker 	return rval;
712*49cdfc7eSAndroid Build Coastguard Worker }
713