summary refs log tree commit diff
path: root/kvm/src/lib.rs
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor@chromium.org>2018-03-01 15:29:27 -0800
committerchrome-bot <chrome-bot@chromium.org>2018-03-08 00:37:32 -0800
commite423460238fe1cfb8853faef3b855f1ce53b756c (patch)
treec3601b3a3c52e4e5d996b9980f957fd74c692292 /kvm/src/lib.rs
parent818afd6eb058b96755a2d1fc1da9def06bfa90c6 (diff)
downloadcrosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar.gz
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar.bz2
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar.lz
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar.xz
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.tar.zst
crosvm-e423460238fe1cfb8853faef3b855f1ce53b756c.zip
kvm: fix invocation of KVM_SET_SIGNAL_MASK ioctl
Linux kernel expects size of sigset passed in through KVM_SET_SIGNAL_MASK
ioctl to be exactly 8, but Rust's sigset size is 128 bytes, so we can
not use sizeof to set up the size.

Also let's add test set_signal_mask().

TEST=cargo test --features plugin; cargo test -p kvm; ./build_test
BUG=chromium:800626

Change-Id: Ica757ad63d6754d5c8008ba1735982c7ca026f33
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/944849
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'kvm/src/lib.rs')
-rw-r--r--kvm/src/lib.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/kvm/src/lib.rs b/kvm/src/lib.rs
index 8037078..2ab3a97 100644
--- a/kvm/src/lib.rs
+++ b/kvm/src/lib.rs
@@ -967,7 +967,15 @@ impl Vcpu {
             // ensures no out-of-bounds errors below.
             &mut *(vec.as_ptr() as *mut kvm_signal_mask)
         };
-        kvm_sigmask.len = size_of::<sigset_t>() as u32;
+
+        // Rust definition of sigset_t takes 128 bytes, but the kernel only
+        // expects 8-bytes structure, so we can't write
+        // kvm_sigmask.len  = size_of::<sigset_t>() as u32;
+        kvm_sigmask.len = 8;
+        // Ensure the length is not too big.
+        const _ASSERT: usize = size_of::<sigset_t>() - 8 as usize;
+
+        // Safe as we allocated exactly the needed space
         unsafe {
             std::ptr::copy(&sigset, kvm_sigmask.sigset.as_mut_ptr() as *mut sigset_t, 1);
         }
@@ -1302,6 +1310,15 @@ mod tests {
     }
 
     #[test]
+    fn set_signal_mask() {
+        let kvm = Kvm::new().unwrap();
+        let gm = GuestMemory::new(&vec![(GuestAddress(0), 0x10000)]).unwrap();
+        let vm = Vm::new(&kvm, gm).unwrap();
+        let vcpu = Vcpu::new(0, &kvm, &vm).unwrap();
+        vcpu.set_signal_mask(&[sys_util::SIGRTMIN() + 0]).unwrap();
+    }
+
+    #[test]
     fn vcpu_mmap_size() {
         let kvm = Kvm::new().unwrap();
         let mmap_size = kvm.get_vcpu_mmap_size().unwrap();