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

Reply via email to