3 #include <sys/resource.h>
12 /* We jump through hoops to eliminate the possibility of partial failures. */
14 int __setrlimit(int, const struct rlimit *);
16 static void do_setxid(void *p)
20 if (c->rlim && c->id >= 0 && c->id != getuid()) {
21 struct rlimit inf = { RLIM_INFINITY, RLIM_INFINITY }, old;
22 getrlimit(RLIMIT_NPROC, &old);
23 if ((c->err = -__setrlimit(RLIMIT_NPROC, &inf)) && libc.threads_minus_1)
25 c->err = -__syscall(c->nr, c->id, c->eid, c->sid);
26 __setrlimit(RLIMIT_NPROC, &old);
29 c->err = -__syscall(c->nr, c->id, c->eid, c->sid);
32 int __setxid(int nr, int id, int eid, int sid)
34 struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid };
41 __synccall(do_setxid, &c);