diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-01-15 07:09:14 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-01-15 07:09:14 -0500 |
commit | 472e8b71f7a90ab23f1499fd721b872541f52de9 (patch) | |
tree | 4b4be3ff0e05264ce4929eb80e02dee5a42e3029 | |
parent | 996d148bf14b477b07fa3691bffeb930c67b2b62 (diff) | |
download | musl-472e8b71f7a90ab23f1499fd721b872541f52de9.tar.gz musl-472e8b71f7a90ab23f1499fd721b872541f52de9.tar.bz2 musl-472e8b71f7a90ab23f1499fd721b872541f52de9.tar.xz musl-472e8b71f7a90ab23f1499fd721b872541f52de9.zip |
for multithreaded set*id/setrlimit, handle case where callback does not run
in the current version of __synccall, the callback is always run, so
failure to handle this case did not matter. however, the upcoming
overhaul of __synccall will have failure cases, in which case the
callback does not run and errno is already set. the changes being
committed now are in preparation for that.
-rw-r--r-- | src/misc/setrlimit.c | 6 | ||||
-rw-r--r-- | src/unistd/setxid.c | 2 |
2 files changed, 4 insertions, 4 deletions
diff --git a/src/misc/setrlimit.c b/src/misc/setrlimit.c index 8a1b8cc6..7130d719 100644 --- a/src/misc/setrlimit.c +++ b/src/misc/setrlimit.c @@ -32,16 +32,16 @@ struct ctx { static void do_setrlimit(void *p) { struct ctx *c = p; - if (c->err) return; + if (c->err>0) return; c->err = -__setrlimit(c->res, c->rlim); } int setrlimit(int resource, const struct rlimit *rlim) { - struct ctx c = { .res = resource, .rlim = rlim }; + struct ctx c = { .res = resource, .rlim = rlim, .err = -1 }; __synccall(do_setrlimit, &c); if (c.err) { - errno = c.err; + if (c.err>0) errno = c.err; return -1; } return 0; diff --git a/src/unistd/setxid.c b/src/unistd/setxid.c index 9e37ddc4..0239f8af 100644 --- a/src/unistd/setxid.c +++ b/src/unistd/setxid.c @@ -32,7 +32,7 @@ int __setxid(int nr, int id, int eid, int sid) struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid, .err = -1 }; __synccall(do_setxid, &c); if (c.err) { - errno = c.err; + if (c.err>0) errno = c.err; return -1; } return 0; |