<br><br><div class="gmail_quote">20 января 2011 г. 2:35 пользователь Dmitry V. Levin <span dir="ltr"><<a href="mailto:ldv@altlinux.org">ldv@altlinux.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On Tue, Jul 27, 2010 at 08:14:12PM +0600, Марк Коренберг wrote:<br>
> I have set up bad NFS server.<br>
> All  user/group of files became 4294967294:4294967294.<br>
><br>
> I have /bin/mount set-uid bit.<br>
><br>
> So, when mount executes it will have euid=4294967294.<br>
> When I do strace mount .... I see geteuid32() = -1 ENOENT (No such file or<br>
> directory), But man says that this syscall never return error...<br>
<br>
Thanks for the report, and sorry for the long delay.<br>
<br>
> Please fix. This syscall return unsigned integer (uid_t). Please check other<br>
> syscalls returning uid_t<br>
<br>
This bug was not so easily fixable because strace had no notion of<br>
syscalls that are always successful.<br>
<br>
Here is a test case:<br>
$ cat tgid.c<br>
#include <unistd.h><br>
#include <sys/fsuid.h><br>
int main(void)<br>
{<br>
        const gid_t gid = -18;<br>
        setgid(gid);<br>
        getegid();<br>
        setfsgid(gid);<br>
        return 0;<br>
}<br>
$ gcc -std=gnu99 -m32 -O2 -Wall tgid.c -o tgid32<br>
$ gcc -std=gnu99 -m64 -O2 -Wall tgid.c -o tgid64<br>
# strace32 -e trace=setgid,setgid32,setfsgid,setfsgid32,getegid,getegid32 ./tgid32<br>
setgid32(4294967278)                    = 0<br>
getegid32()                             = -1 EXDEV (Invalid cross-device link)<br>
setfsgid32(4294967278)                  = -1 EXDEV (Invalid cross-device link)<br>
# strace64 -e trace=setgid,setgid32,setfsgid,setfsgid32,getegid,getegid32 ./tgid32<br>
[ Process PID=5678 runs in 32 bit mode. ]<br>
setgid32(4294967278)                    = 0<br>
getegid32()                             = -1 EXDEV (Invalid cross-device link)<br>
setfsgid32(4294967278)                  = -1 EXDEV (Invalid cross-device link)<br>
# strace64 -e trace=setgid,setgid32,setfsgid,setfsgid32,getegid,getegid32 ./tgid64<br>
setgid(4294967278)                      = 0<br>
getegid()                               = 4294967278<br>
setfsgid(4294967278)                    = -1 EXDEV (Invalid cross-device link)<br>
<br>
And here is a proposed fix:<br>
<a href="http://strace.git.sourceforge.net/git/gitweb.cgi?p=strace/strace;a=commitdiff;h=v4.5.20-61-g50a218d" target="_blank">http://strace.git.sourceforge.net/git/gitweb.cgi?p=strace/strace;a=commitdiff;h=v4.5.20-61-g50a218d</a><br>

<font color="#888888"><br>
<br>
--<br>
ldv<br>
</font></blockquote></div><br>Well, well :)<div><br></div><div>There are more syscalls that never fail. For example, getpid, getppid, gettid, getpagesize</div><div>It should be checked, but maybe all syscalls returning pid_t ?</div>
<div><br></div><div>There are some VERY strange places in kernel. see getpriority / setpriority syscall about return value and errno</div><div><br></div><div><br></div><div>Also, it is desirable to add flag MAY_FAIL to destinguish between syscalls that may fail and syscalls for which we do not have information.</div>
<div><br></div><div><br></div><div><br clear="all"><br>-- <br>Segmentation fault<br>
</div>