diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index 4ac3347f1880cd8d0384312971f3737f5ef114cf..6989ee525c6c37814f73731f1411cf18df13431f 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 1c645386a76758aa73601dbe5ed6aa9db6728fc5..1a03cfb79e046620342d593349346b17116ffa4e 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 8b30339e9e79eef1bafd1a2a4cdeb852b10658fd..fb9d2dfc359118a64aef9796bfed56b97dea5e89 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 e1b1351f35ae0d8e556373aa5aea7cc266d28fe0..3986842193c03a566653410705845aa3ce7a5192 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 }