* sysdeps/posix/spawni.c (__spawni): Use local_seteuid and

local_setegid instead of seteuid and setegid.
	* sysdeps/generic/local-setxid.h: New file.
	* sysdeps/unix/sysv/linux/local-setxid.h: New file.
This commit is contained in:
Ulrich Drepper 2006-06-04 22:17:06 +00:00
parent 7231452e5c
commit 1b8373f475
4 changed files with 35 additions and 1 deletions

View File

@ -1,5 +1,10 @@
2006-06-04 Ulrich Drepper <drepper@redhat.com>
* sysdeps/posix/spawni.c (__spawni): Use local_seteuid and
local_setegid instead of seteuid and setegid.
* sysdeps/generic/local-setxid.h: New file.
* sysdeps/unix/sysv/linux/local-setxid.h: New file.
* sysdeps/posix/spawni.c (__spawni): Use non-cancelable interfaces.
* string/Makefile (tests): Add bug-envz1.

View File

@ -0,0 +1,4 @@
/* No special support. Fall back to the regular functions. */
#define local_seteuid(id) seteuid (id)
#define local_setegid(id) setegid (id)

View File

@ -26,6 +26,7 @@
#include <unistd.h>
#include "spawn_int.h"
#include <not-cancel.h>
#include <local-setxid.h>
/* The Unix standard contains a long explanation of the way to signal
@ -155,7 +156,8 @@ __spawni (pid_t *pid, const char *file,
/* Set the effective user and group IDs. */
if ((flags & POSIX_SPAWN_RESETIDS) != 0
&& (seteuid (__getuid ()) != 0 || setegid (__getgid ()) != 0))
&& (local_seteuid (__getuid ()) != 0
|| local_setegid (__getgid ()) != 0))
_exit (SPAWN_ERROR);
/* Execute the file actions. */

View File

@ -0,0 +1,23 @@
/* SETxID functions which only have to change the local thread and
none of the possible other threads. */
#include <kernel-features.h>
#include <sysdep.h>
/* If we can use the syscall directly, use it. */
#if __ASSUME_32BITUIDS > 0 && defined __NR_setresuid32
# define local_seteuid(id) INLINE_SYSCALL (setresuid32, 3, -1, id, -1)
#elif __ASSUME_SETRESUID_SYSCALL > 0
# define local_seteuid(id) INLINE_SYSCALL (setresuid, 3, -1, id, -1)
#else
# define local_seteuid(id) seteuid (id)
#endif
/* If we can use the syscall directly, use it. */
#if __ASSUME_32BITUIDS > 0 && defined __NR_setresgid32
# define local_setegid(id) INLINE_SYSCALL (setresgid32, 3, -1, id, -1)
#elif __ASSUME_SETRESGID_SYSCALL > 0
# define local_setegid(id) INLINE_SYSCALL (setresgid, 3, -1, id, -1)
#else
# define local_setegid(id) setegid (id)
#endif