diff options
-rw-r--r-- | lib/rtapelib.c | 5 | ||||
-rw-r--r-- | lib/system.h | 25 | ||||
-rw-r--r-- | paxlib/rtape.c | 5 |
3 files changed, 17 insertions, 18 deletions
diff --git a/lib/rtapelib.c b/lib/rtapelib.c index fae0db8..0c516e5 100644 --- a/lib/rtapelib.c +++ b/lib/rtapelib.c @@ -504,7 +504,10 @@ rmt_open__ (const char *file_name, int open_mode, int bias, error (EXIT_ON_EXEC_ERROR, errno, _("Cannot redirect files for remote shell")); - sys_reset_uid_gid (); + char const *reseterr = sys_reset_uid_gid (); + if (reseterr) + error (EXIT_ON_EXEC_ERROR, errno, + _("Cannot reset uid and gid: %s"), reseterr); if (remote_user) execl (remote_shell, remote_shell_basename, remote_host, diff --git a/lib/system.h b/lib/system.h index 1bd5ba9..6acefd7 100644 --- a/lib/system.h +++ b/lib/system.h @@ -470,29 +470,22 @@ char *getenv (); # define SET_BINARY_MODE(arc) # define TTY_NAME "/dev/tty" # include <paxlib.h> -static inline void +static inline char const * sys_reset_uid_gid (void) { - struct passwd *pw; uid_t uid = getuid (); gid_t gid = getgid (); + struct passwd *pw = getpwuid (uid); - if ((pw = getpwuid (uid)) == NULL) - { - FATAL_ERROR ((0, errno, "%s(%lu)", "getpwuid", (unsigned long)uid)); - } - if (initgroups (pw->pw_name, getgid ())) - { - FATAL_ERROR ((0, errno, "%s", "initgroups")); - } + if (!pw) + return "getpwuid"; + if (initgroups (pw->pw_name, gid)) + return "initgroups"; if (gid != getegid () && setgid (gid) && errno != EPERM) - { - FATAL_ERROR ((0, errno, "%s", "setgid")); - } + return "setgid"; if (uid != geteuid () && setuid (uid) && errno != EPERM) - { - FATAL_ERROR ((0, errno, "%s", "setuid")); - } + return "setuid"; + return NULL; } #endif diff --git a/paxlib/rtape.c b/paxlib/rtape.c index 41f6ef1..0a31c44 100644 --- a/paxlib/rtape.c +++ b/paxlib/rtape.c @@ -503,7 +503,10 @@ rmt_open (const char *file_name, int open_mode, int bias, close (from_remote[remote_pipe_number][PREAD]); close (from_remote[remote_pipe_number][PWRITE]); - sys_reset_uid_gid (); + char const *reseterr = sys_reset_uid_gid (); + if (reseterr) + error (EXIT_ON_EXEC_ERROR, errno, + _("Cannot reset uid and gid: %s"), reseterr); if (!rmt_command) rmt_command = DEFAULT_RMT_COMMAND; |