This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Hi! This is what I changed in 32bit uid support so far (am hacking on new IPC stuff right now): For syscalls which use low2high[ug]id in the kernel (e.g. chown family, etc.), we have to accept -1 (which in some cases would be refused, e.g. new i386 lchown), but should not IMHO accept 0xffff, since it will do a different thing than the user expects. m68k chown was broken. On sparc, we introduced setres[ug]id just now, and only in the 32bit uid variants, so there is no need for backward compatibility. I wonder why we accept setuid(-1) etc. It is quite inconsistent. Why we accept that and return EINVAL for -2? IMHO we should not accept it at all, if user wants to setuid(65535), he can do it that way. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setgid.c (__setgid): Add comment. * sysdeps/unix/sysv/linux/i386/setuid.c (__setuid): Add comment. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol. --- libc/sysdeps/unix/sysv/linux/i386/chown.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/chown.c Mon Jan 17 08:32:23 2000 @@ -38,7 +38,7 @@ */ extern int __syscall_chown (const char *__file, - uid_t __owner, gid_t __group); + __kernel_uid_t __owner, __kernel_gid_t __group); #if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0 /* Running under Linux > 2.1.80. */ @@ -76,6 +76,13 @@ __real_chown (const char *file, uid_t ow __libc_missing_32bit_uids = 1; } # endif /* __NR_chown32 */ + if ( ((owner + 1) > (__kernel_uid_t) -1U) || + ((group + 1) > (__kernel_gid_t) -1U) ) + { + __set_errno (EINVAL); + return -1; + } + result = INLINE_SYSCALL (chown, 3, file, owner, group); if (result >= 0 || errno != ENOSYS) @@ -105,6 +112,13 @@ __real_chown (const char *file, uid_t ow __libc_missing_32bit_uids = 1; } # endif /* __NR_chown32 */ + if ( ((owner + 1) > (__kernel_uid_t) -1U) || + ((group + 1) > (__kernel_gid_t) -1U) ) + { + __set_errno (EINVAL); + return -1; + } + return INLINE_SYSCALL (chown, 3, file, owner, group); # endif } --- libc/sysdeps/unix/sysv/linux/i386/lchown.c.jj Mon Jan 17 06:18:45 2000 +++ libc/sysdeps/unix/sysv/linux/i386/lchown.c Mon Jan 17 08:33:33 2000 @@ -60,8 +60,8 @@ __lchown (const char *file, uid_t owner, } # endif /* __NR_lchown32 */ - if ( (owner != (uid_t) ((__kernel_uid_t) owner)) || - (group != (gid_t) ((__kernel_gid_t) group)) ) + if ( ((owner + 1) > (__kernel_uid_t) -1U) || + ((group + 1) > (__kernel_gid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/i386/fchown.c.jj Mon Jan 17 06:18:52 2000 +++ libc/sysdeps/unix/sysv/linux/i386/fchown.c Mon Jan 17 08:29:34 2000 @@ -59,8 +59,8 @@ __fchown (int fd, uid_t owner, gid_t gro } # endif /* __NR_fchown32 */ - if ( (owner != (uid_t) ((__kernel_uid_t) owner)) || - (group != (gid_t) ((__kernel_gid_t) group)) ) + if ( ((owner + 1) > (__kernel_uid_t) -1U) || + ((group + 1) > (__kernel_gid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/i386/setgid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setgid.c Mon Jan 17 08:48:05 2000 @@ -60,6 +60,7 @@ __setgid (gid_t gid) } # endif /* __NR_setgid32 */ + /* This is wrong. We should not accept gid -1U. */ if (gid == (gid_t) ~0 || gid != (gid_t) ((__kernel_gid_t) gid)) { --- libc/sysdeps/unix/sysv/linux/i386/setuid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setuid.c Mon Jan 17 08:49:44 2000 @@ -58,6 +58,7 @@ __setuid (uid_t uid) } # endif /* __NR_setuid32 */ + /* This is wrong. We should not accept gid -1U. */ if (uid == (uid_t) ~0 || uid != (uid_t) ((__kernel_uid_t) uid)) { --- libc/sysdeps/unix/sysv/linux/i386/setresuid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setresuid.c Mon Jan 17 08:51:59 2000 @@ -62,9 +62,9 @@ __setresuid (uid_t ruid, uid_t euid, uid } # endif /* __NR_setresuid32 */ - if ((ruid != (uid_t) -1 && ruid != (uid_t) (__kernel_uid_t) ruid) - || (euid != (uid_t) -1 && euid != (uid_t) (__kernel_uid_t) euid) - || (suid != (uid_t) -1 && suid != (uid_t) (__kernel_uid_t) suid)) + if ( ((ruid + 1) > (__kernel_uid_t) -1U) || + ((euid + 1) > (__kernel_uid_t) -1U) || + ((suid + 1) > (__kernel_uid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/i386/setresgid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setresgid.c Mon Jan 17 08:52:31 2000 @@ -62,9 +62,9 @@ setresgid (gid_t rgid, gid_t egid, gid_t } # endif /* __NR_setresgid32 */ - if ((rgid != (gid_t) -1 && rgid != (gid_t) (__kernel_gid_t) rgid) - || (egid != (gid_t) -1 && egid != (gid_t) (__kernel_gid_t) egid) - || (sgid != (gid_t) -1 && sgid != (gid_t) (__kernel_gid_t) sgid)) + if ( ((rgid + 1) > (__kernel_gid_t) -1U) || + ((egid + 1) > (__kernel_gid_t) -1U) || + ((sgid + 1) > (__kernel_gid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/i386/setregid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setregid.c Mon Jan 17 08:53:11 2000 @@ -59,8 +59,8 @@ __setregid (gid_t rgid, gid_t egid) __libc_missing_32bit_uids = 1; } # endif /* __NR_setregid32 */ - if ((rgid != (gid_t) -1 && rgid != (gid_t) (__kernel_gid_t) rgid) - || (egid != (gid_t) -1 && egid != (gid_t) (__kernel_gid_t) egid)) + if ( ((rgid + 1) > (__kernel_gid_t) -1U) || + ((egid + 1) > (__kernel_gid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/i386/setreuid.c.jj Mon Jan 17 07:58:55 2000 +++ libc/sysdeps/unix/sysv/linux/i386/setreuid.c Mon Jan 17 08:54:14 2000 @@ -59,8 +59,8 @@ __setreuid (uid_t ruid, uid_t euid) __libc_missing_32bit_uids = 1; } # endif /* __NR_setreuid32 */ - if ((ruid != (uid_t) -1 && ruid != (uid_t) (__kernel_uid_t) ruid) - || (euid != (uid_t) -1 && euid != (uid_t) (__kernel_uid_t) euid)) + if ( ((ruid + 1) > (__kernel_uid_t) -1U) || + ((euid + 1) > (__kernel_uid_t) -1U) ) { __set_errno (EINVAL); return -1; --- libc/sysdeps/unix/sysv/linux/m68k/chown.c.jj Mon Jan 17 06:19:42 2000 +++ libc/sysdeps/unix/sysv/linux/m68k/chown.c Mon Jan 17 08:56:44 2000 @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,21 +24,28 @@ #include <linux/posix_types.h> -#include <sysdeps/unix/sysv/linux/32bit_uid_compat.h> - extern int __syscall_chown (const char *__file, - uid_t __owner, gid_t __group); + __kernel_uid_t __owner, __kernel_gid_t __group); #ifdef __NR_chown32 extern int __syscall_chown32 (const char *__file, __kernel_uid32_t owner, __kernel_gid32_t group); + +# if __ASSUME_32BITUIDS == 0 +/* This variable is shared with all files that need to check for 32bit + uids. */ +extern int __libc_missing_32bit_uids; +# endif #endif /* __NR_chown32 */ int __chown (const char *file, uid_t owner, gid_t group) { -#ifdef __NR_chown32 - if (__libc_missing_32bit_uids != NO_HIGHUIDS) +# if __ASSUME_32BITUIDS > 0 + return INLINE_SYSCALL (chown32, 3, file, owner, group); +# else +# ifdef __NR_chown32 + if (!__libc_missing_32bit_uids) { int result; int saved_errno = errno; @@ -48,10 +55,19 @@ __chown (const char *file, uid_t owner, return result; __set_errno (saved_errno); - __libc_missing_32bit_uids = NO_HIGHUIDS; + __libc_missing_32bit_uids = 1; + } +# endif /* __NR_chown32 */ + + if ( ((owner + 1) > (__kernel_uid_t) -1U) || + ((group + 1) > (__kernel_gid_t) -1U) ) + { + __set_errno (EINVAL); + return -1; } -#endif /* __NR_chown32 */ return INLINE_SYSCALL (chown, 3, file, owner, group); + +# endif } weak_alias (__chown, chown) --- libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list.jj Tue Dec 28 11:33:43 1999 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list Mon Jan 17 09:03:50 2000 @@ -8,8 +8,6 @@ s_setfsuid setfsuid setfsuid 1 __syscall s_setgid setgid setgid 1 __syscall_setgid s_setgroups setgroups setgroups 2 __syscall_setgroups s_setregid setregid setregid 2 __syscall_setregid -s_setresgid setresgid setresgid 3 __syscall_setresgid -s_setresuid setresuid setresuid 3 __syscall_setresuid s_setreuid setreuid setreuid 2 __syscall_setreuid s_setrlimit setrlimit setrlimit 3 __syscall_setrlimit s_ipc msgget ipc 5 __syscall_ipc --- libc/sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c.jj Fri Oct 16 18:31:58 1998 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c Mon Jan 17 09:09:25 2000 @@ -1 +0,0 @@ -#include <sysdeps/unix/sysv/linux/i386/setresgid.c> --- libc/sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c.jj Fri Oct 16 18:32:03 1998 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c Mon Jan 17 09:09:28 2000 @@ -1 +0,0 @@ -#include <sysdeps/unix/sysv/linux/i386/setresuid.c> --- libc/sysdeps/unix/sysv/linux/syscalls.list.jj Fri Dec 10 15:15:34 1999 +++ libc/sysdeps/unix/sysv/linux/syscalls.list Mon Jan 17 09:08:40 2000 @@ -53,7 +53,7 @@ setfsgid EXTRA setfsgid 1 setfsgid setfsuid EXTRA setfsuid 1 setfsuid setpgid - setpgid 2 __setpgid setpgid setresuid EXTRA setresuid 3 __setresuid setresuid -setresgid EXTRA setresgid 3 setresgid +setresgid EXTRA setresgid 3 __setresgid setresgid sigaltstack - sigaltstack 2 __sigaltstack sigaltstack sysinfo EXTRA sysinfo 1 sysinfo swapon - swapon 2 __swapon swapon Cheers, Jakub ___________________________________________________________________ Jakub Jelinek | jakub@redhat.com | http://sunsite.mff.cuni.cz/~jj Linux version 2.3.39 on a sparc64 machine (1343.49 BogoMips) ___________________________________________________________________
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |