1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
From: Christian Kastner <ckk@kvr.at>
Date: Sat, 26 Dec 2015 11:00:07 +0100
Subject: Swap both uid and gid
When swapping uid, also swap the gid.
Fix provided by Solar Designer.
Forwarded: no
Last-Update: 2015-12-26
---
misc.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/misc.c b/misc.c
index cf4a74c..1ab2b99 100644
--- a/misc.c
+++ b/misc.c
@@ -695,10 +695,21 @@ arpadate(clock)
#ifdef HAVE_SAVED_UIDS
-static int save_euid;
-int swap_uids() { save_euid = geteuid(); return seteuid(getuid()); }
-int swap_uids_back() { return seteuid(save_euid); }
+static uid_t save_euid, save_egid;
+int swap_uids()
+{
+ save_euid = geteuid(); save_egid = getegid();
+ return (setegid(getgid()) || seteuid(getuid())) ? -1 : 0;
+}
+int swap_uids_back()
+{
+ return (setegid(save_egid) || seteuid(save_euid)) ? -1 : 0;
+}
#else /*HAVE_SAVED_UIDS*/
-int swap_uids() { return setreuid(geteuid(), getuid()); }
+int swap_uids()
+{
+ return (setregid(getegid(), getgid()) || setreuid(geteuid(), getuid()))
+ ? -1 : 0;
+}
int swap_uids_back() { return swap_uids(); }
#endif /*HAVE_SAVED_UIDS*/
|