Il 10/10/2012 18:54, Stefan Weil ha scritto:
>>
>> if (setfsuid(uid) < 0 || setfsuid(uid) != uid) {
>> return -1;
>> }
>>
>> but it seems wasteful to do four syscalls instead of two.
>
> I added a local variable in my example to avoid those extra
> syscalls.
Note that the two setfsuid() calls are different.
The first checks the "-1" error from glibc. The second says "if the
first call succeeded, the second call should see "uid" as the current
fsuid and the second call will be a no-op; if not, the first call must
have failed".
> The functions have an additional problem: they don't set
> errno (see manpages). I tested this, and here the manpages
> are correct. The code in virtfs-proxy-helper expects that
> errno was set, so the patch must set errno = EPERM or
> something like that.
So it would be
if (setfsuid(uid) < 0) {
return -1;
}
if (setfsuid(uid) != uid) {
errno = EPERM;
return -1;
}
I still prefer my v2 (v1 is wrong). The return path seems to be dead,
but it's not worse than before...
Paolo