diff --git a/crates/wiggle/src/borrow.rs b/crates/wiggle/src/borrow.rs index c08ffea178..61851e8f57 100644 --- a/crates/wiggle/src/borrow.rs +++ b/crates/wiggle/src/borrow.rs @@ -22,6 +22,9 @@ impl BorrowChecker { pub fn unborrow(&self, h: BorrowHandle) { self.bc.borrow_mut().unborrow(h) } + pub fn is_borrowed(&self, r: Region) -> bool { + self.bc.borrow().is_borrowed(r) + } } #[derive(Debug)] diff --git a/crates/wiggle/src/guest_type.rs b/crates/wiggle/src/guest_type.rs index a4a497c020..47a5a80e09 100644 --- a/crates/wiggle/src/guest_type.rs +++ b/crates/wiggle/src/guest_type.rs @@ -81,13 +81,14 @@ macro_rules! primitives { Self::guest_align(), size, )?; - let borrow_handle = ptr.borrow_checker().borrow( Region { + let region = Region { start: offset, len: size, - })?; - let v = unsafe { *host_ptr.cast::() }; - ptr.borrow_checker().unborrow(borrow_handle); - Ok(v) + }; + if ptr.borrow_checker().is_borrowed(region) { + return Err(GuestError::PtrBorrowed(region)); + } + Ok(unsafe { *host_ptr.cast::() }) } #[inline] @@ -99,14 +100,16 @@ macro_rules! primitives { Self::guest_align(), size, )?; - let borrow_handle = ptr.borrow_checker().borrow( Region { + let region = Region { start: offset, len: size, - })?; + }; + if ptr.borrow_checker().is_borrowed(region) { + return Err(GuestError::PtrBorrowed(region)); + } unsafe { *host_ptr.cast::() = val; } - ptr.borrow_checker().unborrow(borrow_handle); Ok(()) } }