mirror of
https://github.com/fluencelabs/musl
synced 2025-05-22 04:01:34 +00:00
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.
This commit is contained in:
parent
996d148bf1
commit
472e8b71f7
@ -32,16 +32,16 @@ struct ctx {
|
|||||||
static void do_setrlimit(void *p)
|
static void do_setrlimit(void *p)
|
||||||
{
|
{
|
||||||
struct ctx *c = p;
|
struct ctx *c = p;
|
||||||
if (c->err) return;
|
if (c->err>0) return;
|
||||||
c->err = -__setrlimit(c->res, c->rlim);
|
c->err = -__setrlimit(c->res, c->rlim);
|
||||||
}
|
}
|
||||||
|
|
||||||
int setrlimit(int resource, const struct rlimit *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);
|
__synccall(do_setrlimit, &c);
|
||||||
if (c.err) {
|
if (c.err) {
|
||||||
errno = c.err;
|
if (c.err>0) errno = c.err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -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 };
|
struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid, .err = -1 };
|
||||||
__synccall(do_setxid, &c);
|
__synccall(do_setxid, &c);
|
||||||
if (c.err) {
|
if (c.err) {
|
||||||
errno = c.err;
|
if (c.err>0) errno = c.err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user