summary refs log tree commit diff
path: root/io_jail/src
diff options
context:
space:
mode:
authorZach Reizner <zachr@google.com>2017-06-30 15:46:25 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-06-30 22:24:50 -0700
commit848b9ff6251ef125d394026d08c1a183395171f9 (patch)
tree26b26163f927954e994ac505bf3e8526007d95bd /io_jail/src
parent1247525aace195ea30dae8f969f51690aed7c281 (diff)
downloadcrosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar.gz
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar.bz2
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar.lz
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar.xz
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.tar.zst
crosvm-848b9ff6251ef125d394026d08c1a183395171f9.zip
io_jail: add bind mount
This will be used by some device jails to get access to unix sockets
after being jailed.

TEST=None
BUG=None

Change-Id: I870bfb155b275769ccb3248b1441e7c0b8f20ad7
Reviewed-on: https://chromium-review.googlesource.com/558447
Commit-Ready: Zach Reizner <zachr@chromium.org>
Tested-by: Zach Reizner <zachr@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'io_jail/src')
-rw-r--r--io_jail/src/lib.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/io_jail/src/lib.rs b/io_jail/src/lib.rs
index 04b8070..d225e85 100644
--- a/io_jail/src/lib.rs
+++ b/io_jail/src/lib.rs
@@ -18,6 +18,8 @@ use std::str::FromStr;
 
 #[derive(Debug)]
 pub enum Error {
+    // minijail failed to accept bind mount.
+    BindMount(i32),
     /// minjail_new failed, this is an allocation failure.
     CreatingMinijail,
     /// The path or name string passed in didn't parse to a valid CString.
@@ -208,6 +210,17 @@ impl Minijail {
     pub fn mount_tmp_size(&mut self, size: usize) {
         unsafe { libminijail::minijail_mount_tmp_size(self.jail, size); }
     }
+    pub fn mount_bind(&mut self, src: &Path, dest: &Path, writable: bool) -> Result<()> {
+        let src = src.as_os_str().to_str().ok_or(Error::InvalidCString)?;
+        let src = CString::new(src).map_err(|_| Error::InvalidCString)?;
+        let dest = dest.as_os_str().to_str().ok_or(Error::InvalidCString)?;
+        let dest = CString::new(dest).map_err(|_| Error::InvalidCString)?;
+        let ret = unsafe { libminijail::minijail_bind(self.jail, src.as_ptr(), dest.as_ptr(), writable as _) };
+        if ret < 0 {
+            return Err(Error::BindMount(ret));
+        }
+        Ok(())
+    }
 
     /// Enters the previously configured minijail.
     /// `enter` is unsafe because it closes all open FD for this process.  That