[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#10021: [PATCH id] Add error-checking on GNU
From: |
Paul Eggert |
Subject: |
bug#10021: [PATCH id] Add error-checking on GNU |
Date: |
Tue, 15 Nov 2011 13:26:02 -0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:7.0) Gecko/20110927 Thunderbird/7.0 |
I found yet-another tricky bug in that id.c code,
and fixed it as follows:
>From 5ca593e87eb1361b4696dd1e002a8ee310a5d1f6 Mon Sep 17 00:00:00 2001
From: Paul Eggert <address@hidden>
Date: Tue, 15 Nov 2011 13:23:24 -0800
Subject: [PATCH] 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 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/src/id.c b/src/id.c
index 8f7ce9e..1047149 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)
--
1.7.6.4
- bug#10021: [PATCH id] Add error-checking on GNU, (continued)
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/14
- bug#10021: [PATCH id] Add error-checking on GNU, Eric Blake, 2011/11/14
- bug#10021: [PATCH id] Add error-checking on GNU, Ludovic Courtès, 2011/11/14
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/14
- bug#10021: [PATCH id] Add error-checking on GNU, Ludovic Courtès, 2011/11/15
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/15
- bug#10021: [PATCH id] Add error-checking on GNU, Eric Blake, 2011/11/15
- bug#10021: [PATCH id] Add error-checking on GNU, Eric Blake, 2011/11/16
- bug#10021: [PATCH id] Add error-checking on GNU, Jim Meyering, 2011/11/15
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/15
- bug#10021: [PATCH id] Add error-checking on GNU,
Paul Eggert <=
- bug#10021: [PATCH id] Add error-checking on GNU, Jim Meyering, 2011/11/19
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/16
- bug#10021: [PATCH id] Add error-checking on GNU, Paul Eggert, 2011/11/20
- bug#10021: [PATCH id] Add error-checking on GNU, Roland McGrath, 2011/11/14
- bug#10021: [PATCH id] Add error-checking on GNU, Jim Meyering, 2011/11/13
- bug#10021: [PATCH id] Add error-checking on GNU, Ludovic Courtès, 2011/11/13
- bug#10021: [PATCH id] Add error-checking on GNU, Jim Meyering, 2011/11/14