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