From: Paul Eggert Date: Tue, 15 Nov 2011 21:23:24 +0000 (-0800) Subject: id: fix bug when euid != ruid X-Git-Tag: v8.15~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f512f9bdb2cf436e4ec63c31410d8033d75779a;p=thirdparty%2Fcoreutils.git id: fix bug when euid != ruid * src/id.c (main): Report an error if no args are given and getuid fails, because print_full_info needs ruid. Redo code so that getuid and friends are invoked only when needed; this makes the code easier to follow, and is how I found the above bug. --- diff --git a/src/id.c b/src/id.c index 8f7ce9e5a3..10471491cd 100644 --- a/src/id.c +++ b/src/id.c @@ -207,27 +207,36 @@ main (int argc, char **argv) uid_t NO_UID = -1; gid_t NO_GID = -1; - errno = 0; - euid = geteuid (); - if (euid == NO_UID && errno && !use_real - && !just_group && !just_group_list && !just_context) - error (EXIT_FAILURE, errno, _("cannot get effective UID")); - - errno = 0; - ruid = getuid (); - if (ruid == NO_UID && errno && use_real - && !just_group && !just_group_list && !just_context) - error (EXIT_FAILURE, errno, _("cannot get real UID")); - - errno = 0; - egid = getegid (); - if (egid == NO_GID && errno && !use_real && !just_user) - error (EXIT_FAILURE, errno, _("cannot get effective GID")); - - errno = 0; - rgid = getgid (); - if (rgid == NO_GID && errno && use_real && !just_user) - error (EXIT_FAILURE, errno, _("cannot get real GID")); + if (just_user ? !use_real + : !just_group && !just_group_list && !just_context) + { + errno = 0; + euid = geteuid (); + if (euid == NO_UID && errno) + error (EXIT_FAILURE, errno, _("cannot get effective UID")); + } + + if (just_user ? use_real + : !just_group && (just_group_list || !just_context)) + { + errno = 0; + ruid = getuid (); + if (ruid == NO_UID && errno) + error (EXIT_FAILURE, errno, _("cannot get real UID")); + } + + if (!just_user && (just_group || just_group_list || !just_context)) + { + errno = 0; + egid = getegid (); + if (egid == NO_GID && errno) + error (EXIT_FAILURE, errno, _("cannot get effective GID")); + + errno = 0; + rgid = getgid (); + if (rgid == NO_GID && errno) + error (EXIT_FAILURE, errno, _("cannot get real GID")); + } } if (just_user)