提交 472e8b71 编写于 作者: R Rich Felker

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.
上级 996d148b
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册