From bf26de70e2377a34d0d95eeaa74188eddd7b807e Mon Sep 17 00:00:00 2001
From: 4lDO2 <4lDO2@protonmail.com>
Date: Thu, 18 Jul 2024 23:54:46 +0200
Subject: [PATCH] Add setresuid/setresgid (suid/sgid stub on Redox).

---
 src/header/unistd/mod.rs  | 16 ++++++++++++----
 src/platform/linux/mod.rs |  8 ++++----
 src/platform/pal/mod.rs   |  4 ++--
 src/platform/redox/mod.rs | 10 ++++++++--
 4 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs
index 4ac3347f..6989ee52 100644
--- a/src/header/unistd/mod.rs
+++ b/src/header/unistd/mod.rs
@@ -657,7 +657,7 @@ pub unsafe extern "C" fn rmdir(path: *const c_char) -> c_int {
 
 #[no_mangle]
 pub extern "C" fn setgid(gid: gid_t) -> c_int {
-    Sys::setregid(gid, gid)
+    Sys::setresgid(gid, gid, -1)
 }
 
 #[no_mangle]
@@ -677,12 +677,16 @@ pub extern "C" fn setpgrp() -> pid_t {
 
 #[no_mangle]
 pub extern "C" fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
-    Sys::setregid(rgid, egid)
+    Sys::setresgid(rgid, egid, -1)
+}
+#[no_mangle]
+pub extern "C" fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+    Sys::setresgid(rgid, egid, sgid)
 }
 
 #[no_mangle]
 pub extern "C" fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
-    Sys::setreuid(ruid, euid)
+    Sys::setresuid(ruid, euid, -1)
 }
 
 #[no_mangle]
@@ -692,7 +696,11 @@ pub extern "C" fn setsid() -> pid_t {
 
 #[no_mangle]
 pub extern "C" fn setuid(uid: uid_t) -> c_int {
-    Sys::setreuid(uid, uid)
+    Sys::setresuid(uid, uid, -1)
+}
+#[no_mangle]
+pub extern "C" fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+    Sys::setresuid(ruid, euid, suid)
 }
 
 #[no_mangle]
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 1c645386..1a03cfb7 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -568,12 +568,12 @@ impl Pal for Sys {
         e(unsafe { syscall!(SETPRIORITY, which, who, prio) }) as c_int
     }
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
-        e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+        e(unsafe { syscall!(SETRESGID, rgid, egid, sgid) }) as c_int
     }
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
-        e(unsafe { syscall!(SETREUID, ruid, euid) }) as c_int
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+        e(unsafe { syscall!(SETRESUID, ruid, euid, suid) }) as c_int
     }
 
     fn setsid() -> c_int {
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 8b30339e..fb9d2dfc 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -207,9 +207,9 @@ pub trait Pal {
 
     fn setpriority(which: c_int, who: id_t, prio: c_int) -> c_int;
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int;
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int;
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int;
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int;
 
     fn setsid() -> c_int;
 
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index e1b1351f..39868421 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -930,11 +930,17 @@ impl Pal for Sys {
         }
     }
 
-    fn setregid(rgid: gid_t, egid: gid_t) -> c_int {
+    fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> c_int {
+        if sgid != -1 {
+            println!("TODO: suid");
+        }
         e(syscall::setregid(rgid as usize, egid as usize)) as c_int
     }
 
-    fn setreuid(ruid: uid_t, euid: uid_t) -> c_int {
+    fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> c_int {
+        if suid != -1 {
+            println!("TODO: suid");
+        }
         e(syscall::setreuid(ruid as usize, euid as usize)) as c_int
     }
 
-- 
GitLab