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