diff options
author | Markus Wichmann <nullplan@gmx.net> | 2023-11-02 17:39:33 +0100 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2023-11-06 13:07:11 -0500 |
commit | 7bb11f75c50386ca4ac7af32365754135a027193 (patch) | |
tree | eb9bc3d40deb15ac58048c9ff69962025bbbb6c8 /src | |
parent | 7f3a2925369c00abc33457400e33632e6dacb8ae (diff) | |
download | musl-7bb11f75c50386ca4ac7af32365754135a027193.zip musl-7bb11f75c50386ca4ac7af32365754135a027193.tar.gz musl-7bb11f75c50386ca4ac7af32365754135a027193.tar.bz2 |
ensure valid setxid return value in an unexpected error case
If __synccall() fails to capture all threads because tkill fails for
some reason other than EAGAIN, then the callback given will never be
executed, so nothing will ever overwrite the initial value. So that is
the value that will be returned from the function. The previous setting
of 1 is not a valid value for setuid() et al. to return.
I chose -EAGAIN since I don't know the reason the synccall failed ahead
of time, but EAGAIN is a specified error code for a possibly temporary
failure in setuid().
Diffstat (limited to 'src')
-rw-r--r-- | src/unistd/setxid.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/unistd/setxid.c b/src/unistd/setxid.c index 487c1a1..a629ed4 100644 --- a/src/unistd/setxid.c +++ b/src/unistd/setxid.c @@ -30,5 +30,5 @@ int __setxid(int nr, int id, int eid, int sid) * trigger the safety kill above. */ struct ctx c = { .nr = nr, .id = id, .eid = eid, .sid = sid, .ret = 1 }; __synccall(do_setxid, &c); - return __syscall_ret(c.ret); + return __syscall_ret(c.ret > 0 ? -EAGAIN : c.ret); } |