From 8f512f9bdb2cf436e4ec63c31410d8033d75779a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 15 Nov 2011 13:23:24 -0800 Subject: 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. --- src/id.c | 51 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/id.c b/src/id.c index 8f7ce9e5a..10471491c 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) -- cgit v1.2.3-70-g09d2