From a7fba79be7427ad5d2b2d0dd06d68e2f9ee756d9 Mon Sep 17 00:00:00 2001 From: Paul Sajna Date: Fri, 9 Mar 2018 00:28:46 -0800 Subject: [PATCH 1/3] implement setid functions and unlink --- src/platform/src/linux/mod.rs | 16 ++++++++++++++++ src/platform/src/redox/mod.rs | 17 +++++++++++++++++ src/unistd/src/lib.rs | 8 ++++---- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index aa7eef7c00..7025b48757 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -139,6 +139,22 @@ pub fn rmdir(path: *const c_char) -> c_int { e(unsafe { syscall!(UNLINKAT, AT_FDCWD, path, AT_REMOVEDIR) }) as c_int } +pub fn setpgid(pid: pid_t, pgid: pid_t) -> c_int { + e(unsafe { syscall!(SETPGID, pid, pgid) }) as c_int +} + +pub fn setregid(rgid: gid_t, egid: gid_t) -> c_int { + e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int +} + +pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int { + e(unsafe { syscall!(SETREUID, ruid, euid) }) as c_int +} + +pub fn unlink(path: *const c_char) -> c_int { + e(unsafe { syscall!(UNLINKAT, AT_FDCWD, path, 0) }) as c_int +} + pub fn write(fildes: c_int, buf: &[u8]) -> ssize_t { e(unsafe { syscall!(WRITE, fildes, buf.as_ptr(), buf.len()) }) as ssize_t } diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs index 264042d79c..0ea4bda207 100644 --- a/src/platform/src/redox/mod.rs +++ b/src/platform/src/redox/mod.rs @@ -157,6 +157,23 @@ pub fn rmdir(path: *const c_char) -> c_int { e(syscall::rmdir(path)) as c_int } +pub fn setpgid(pid: pid_t, pgid: pid_t) -> c_int { + e(syscall::setpgid(pid as usize, pgid as usize)) as c_int +} + +pub fn setregid(rgid: gid_t, egid: gid_t) -> c_int { + e(syscall::setregid(rgid as usize, egid as usize)) as c_int +} + +pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int { + e(syscall::setreuid(ruid as usize, euid as usize)) as c_int +} + +pub fn unlink(path: *const c_char) -> c_int { + let path = unsafe { c_str(path) }; + e(syscall::unlink(path)) as c_int +} + pub fn write(fd: c_int, buf: &[u8]) -> ssize_t { e(syscall::write(fd as usize, buf)) as ssize_t } diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index e83c8a8280..62912097a1 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -351,7 +351,7 @@ pub extern "C" fn setgid(gid: gid_t) -> c_int { #[no_mangle] pub extern "C" fn setpgid(pid: pid_t, pgid: pid_t) -> c_int { - unimplemented!(); + platform::setpgid(pid, pgid) } #[no_mangle] @@ -361,12 +361,12 @@ pub extern "C" fn setpgrp() -> pid_t { #[no_mangle] pub extern "C" fn setregid(rgid: gid_t, egid: gid_t) -> c_int { - unimplemented!(); + platform::setregid(rgid, egid) } #[no_mangle] pub extern "C" fn setreuid(ruid: uid_t, euid: uid_t) -> c_int { - unimplemented!(); + platform::setreuid(ruid, euid) } #[no_mangle] @@ -436,7 +436,7 @@ pub extern "C" fn ualarm(useconds: useconds_t, interval: useconds_t) -> useconds #[no_mangle] pub extern "C" fn unlink(path: *const c_char) -> c_int { - unimplemented!(); + platform::unlink(path) } #[no_mangle] From 1c1a48b6486f831ecd0e49603c5cf7e44673a129 Mon Sep 17 00:00:00 2001 From: Paul Sajna Date: Fri, 9 Mar 2018 00:56:02 -0800 Subject: [PATCH 2/3] fix formatting --- src/platform/src/linux/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index 7025b48757..e095345382 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -144,7 +144,7 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) -> c_int { } pub fn setregid(rgid: gid_t, egid: gid_t) -> c_int { - e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int + e(unsafe { syscall!(SETREGID, rgid, egid) }) as c_int } pub fn setreuid(ruid: uid_t, euid: uid_t) -> c_int { From 161d93466c6428e4af99d6fe0dffdbfbc909d0f1 Mon Sep 17 00:00:00 2001 From: Paul Sajna Date: Fri, 9 Mar 2018 04:47:59 -0800 Subject: [PATCH 3/3] fixes and tests --- src/platform/src/linux/mod.rs | 2 +- src/unistd/src/lib.rs | 2 +- tests/.gitignore | 2 ++ tests/Makefile | 6 ++++-- tests/link.c | 3 ++- tests/setid.c | 26 ++++++++++++++++++++++++++ tests/unlink.c | 7 +++++++ 7 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 tests/setid.c create mode 100644 tests/unlink.c diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index e095345382..daff60cb57 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -116,7 +116,7 @@ pub fn getuid() -> uid_t { } pub fn link(path1: *const c_char, path2: *const c_char) -> c_int { - e(unsafe { syscall!(LINKAT, AT_FDCWD, path1, path2) }) as c_int + e(unsafe { syscall!(LINKAT, AT_FDCWD, path1, AT_FDCWD, path2, 0) }) as c_int } pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int { diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index 62912097a1..8a1d149f88 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -225,7 +225,7 @@ pub extern "C" fn getpgid(pid: pid_t) -> pid_t { #[no_mangle] pub extern "C" fn getpgrp() -> pid_t { - unimplemented!(); + platform::getpgid(platform::getpid()) } #[no_mangle] diff --git a/tests/.gitignore b/tests/.gitignore index 7b70bccffc..473a19d76d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -23,4 +23,6 @@ /pipe /printf /rmdir +/setid +/unlink /write diff --git a/tests/Makefile b/tests/Makefile index 6c2a838d87..be24852d81 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -16,9 +16,11 @@ BINS=\ getid \ link \ math \ - rmdir \ pipe \ printf \ + rmdir \ + setid \ + unlink \ write all: $(BINS) @@ -28,7 +30,7 @@ clean: run: $(BINS) for bin in $(BINS); \ - do + do \ echo "# $${bin} #"; \ "./$${bin}" test args; \ done diff --git a/tests/link.c b/tests/link.c index 3e36df81fb..383575e8ce 100644 --- a/tests/link.c +++ b/tests/link.c @@ -1,5 +1,6 @@ #include int main(int argc, char** argv) { - int status = link("link.c", "link.out"); + link("./link.c", "./link.out"); + perror("link"); } diff --git a/tests/setid.c b/tests/setid.c new file mode 100644 index 0000000000..ce2b42ea93 --- /dev/null +++ b/tests/setid.c @@ -0,0 +1,26 @@ +/* + * The process joins process group 0. + */ +#include +#include +#include +#include + +int main( void ) + { + if( setpgid( getpid(), 0 ) == -1 ) { + perror( "setpgid" ); + } + printf( "%d belongs to process group %d\n", + getpid(), getpgrp() ); + + if( setregid(-1, -1) == -1 ) { + perror( "setregid" ); + } + printf("%d has egid %d and gid %d\n", getpid(), getegid(), getgid()); + + if( setreuid(-1, -1) == -1 ) { + perror( "setreuid" ); + } + printf("%d has euid %d and uid %d\n", getpid(), geteuid(), getuid()); + } diff --git a/tests/unlink.c b/tests/unlink.c new file mode 100644 index 0000000000..0eceae0ac2 --- /dev/null +++ b/tests/unlink.c @@ -0,0 +1,7 @@ +#include +#include + +int main(int argc, char** argv) { + link("./unlink.c", "./unlink.out"); + perror("unlink"); +}