Hi,
this patch adds correct euid egid handling to id so
to make it fully SuSv3 compliant.
Hints and critics are welcome.
Please apply if you like it.
Ciao,
Tito
--- coreutils/id_orig.c 2008-09-21 14:27:23.000000000 +0200
+++ coreutils/id.c 2008-09-21 14:31:08.000000000 +0200
@@ -74,6 +74,8 @@
struct passwd *p;
uid_t uid;
gid_t gid;
+ uid_t ruid;
+ gid_t rgid;
llist_t *group_list;
unsigned flags;
short status = EXIT_SUCCESS;
@@ -89,18 +91,21 @@
/* This values could be overwritten later */
uid = geteuid();
gid = getegid();
+ ruid = getuid();
+ rgid = getgid();
if (flags & PRINT_REAL) {
- uid = getuid();
- gid = getgid();
+ uid = ruid;
+ gid = rgid;
}
if (username) {
p = getpwnam(username);
/* xuname2uid is needed because it exits on failure */
- uid = xuname2uid(username);
- gid = p->pw_gid; /* in this case PRINT_REAL is the same */
+ ruid = uid = xuname2uid(username);
+ rgid = gid = p->pw_gid; /* in this case PRINT_REAL is the same */
}
- group_list = bb_getgrouplist_malloc(uid, gid, NULL);
+ /* Don't handle egid in default mode */
+ group_list = bb_getgrouplist_malloc(ruid, rgid, (flags) ? &gid : NULL);
if (flags & JUST_ALL_GROUPS) {
status = print_group_list(group_list, flags, NULL);
@@ -138,10 +143,13 @@
/* Print full info like GNU id */
/* bb_getpwuid(0) doesn't exit on failure (returns NULL) */
- status = print_single(uid, bb_getpwuid(NULL, 0, uid), flags, "uid=");
- status |= print_single(gid, bb_getgrgid(NULL, 0, gid), flags, " gid=");
+ status = print_single(ruid, bb_getpwuid(NULL, 0, ruid), flags, "uid=");
+ status |= print_single(rgid, bb_getgrgid(NULL, 0, rgid), flags, " gid=");
+ if (uid != ruid)
+ status |= print_single(uid, bb_getpwuid(NULL, 0, uid), flags, " euid=");
+ if (gid != rgid)
+ status |= print_single(gid, bb_getgrgid(NULL, 0, gid), flags, " egid=");
status |= print_group_list(group_list, flags, " groups=");
-
#if ENABLE_SELINUX
if (is_selinux_enabled()) {
security_context_t mysid;
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox