Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OpenBSD 5.9 pledge(2) bindings
- // http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man2/pledge.2
- // rustc --crate-type=lib pledge.rs
- // rustc -L . main.rs
- //
- // pledge_ffi.rs
- use std::os::raw::c_char;
- use std::os::raw::c_int;
- #[link(name = "c")]
- extern {
- pub fn pledge(promises: *const c_char, paths: *const *const c_char) -> c_int;
- }
- //
- // pledge.rs
- #![crate_type = "lib"]
- use std::ffi::CString;
- mod pledge_ffi;
- pub fn pledge(promises: &str) -> bool {
- if let Ok(c_str) = CString::new(promises) {
- unsafe {
- let result = pledge_ffi::pledge(c_str.as_ptr(), std::ptr::null());
- return result == 0;
- }
- }
- return false;
- }
- //
- // main.rs
- extern crate pledge;
- use pledge::pledge;
- use std::process::exit;
- use std::fs::File;
- use std::io::Write;
- fn main() {
- let mut stderr = std::io::stderr();
- // example will crash
- // change to "stdio rpath"
- if !pledge("stdio") {
- writeln!(&mut stderr, "pledge").unwrap();
- exit(1);
- }
- println!("Now pledged.");
- // attempt elevation
- if !pledge("stdio rpath") {
- writeln!(&mut stderr, "pledge elevation fail").unwrap();
- //exit(1);
- }
- // .. promises were equal or reduced
- println!("Opening a file!");
- // kernel should abort here, unless promises changed
- let file = match File::open("/tmp/bogus/file") {
- Err(_) => exit(1),
- Ok(file) => file,
- };
- drop(file);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement