summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2011-11-15 09:30:49 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2011-11-15 09:31:21 -0800
commit47e511a1d0ee8c82d6e9014fb6a74ab6dfd89d3d (patch)
treeeb9d463ee0cd44c91bb5d3178505b7f7e5a50f42
parent7db79cc4f802aa39b6e03bbfce12c405381f8398 (diff)
downloadcoreutils-47e511a1d0ee8c82d6e9014fb6a74ab6dfd89d3d.tar.xz
id: handle (uid_t) -1 more portably
* src/id.c (GETID_MAY_FAIL): Remove. (main): Check for nonzero errno, rather than having a compile-time GETID_MAY_FAIL guess. Suggested by Roland McGrath in <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10021#47>. Also, the old code was incorrect if uid_t was narrower than int. (print_full_info): Remove unnecessary cast to -1.
-rw-r--r--src/id.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/id.c b/src/id.c
index 047e40b88..9fa93f83e 100644
--- a/src/id.c
+++ b/src/id.c
@@ -38,13 +38,6 @@
proper_name ("Arnold Robbins"), \
proper_name ("David MacKenzie")
-/* Whether the functions getuid, geteuid, getgid and getegid may fail. */
-#ifdef __GNU__
-# define GETID_MAY_FAIL 1
-#else
-# define GETID_MAY_FAIL 0
-#endif
-
/* If nonzero, output only the SELinux context. -Z */
static int just_context = 0;
@@ -208,22 +201,32 @@ main (int argc, char **argv)
}
else
{
+ /* POSIX says getuid etc. cannot fail, but they can fail under
+ GNU/Hurd and a few other systems. Test for failure by
+ checking errno. */
+ uid_t NO_UID = -1;
+ gid_t NO_GID = -1;
+
+ errno = 0;
euid = geteuid ();
- if (GETID_MAY_FAIL && euid == -1 && !use_real
+ 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 (GETID_MAY_FAIL && ruid == -1 && use_real
+ 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 (GETID_MAY_FAIL && egid == -1 && !use_real && !just_user)
+ if (egid == NO_GID && errno && !use_real && !just_user)
error (EXIT_FAILURE, errno, _("cannot get effective GID"));
+ errno = 0;
rgid = getgid ();
- if (GETID_MAY_FAIL && rgid == -1 && use_real && !just_user)
+ if (rgid == NO_GID && errno && use_real && !just_user)
error (EXIT_FAILURE, errno, _("cannot get real GID"));
}
@@ -316,7 +319,7 @@ print_full_info (const char *username)
gid_t *groups;
int i;
- int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1),
+ int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : -1),
&groups);
if (n_groups < 0)
{