From 0d01eac1d44406eef71f6ab908241ccd161a4f99 Mon Sep 17 00:00:00 2001 From: Henry Wang Date: Thu, 2 Sep 2021 04:29:29 -0400 Subject: [PATCH] vmm: Do the downcast of GicDevice in a safer way for AArch64 Downcasting of GicDevice trait might fail. Therefore we try to downcast the trait first and only if the downcasting succeeded we can then use the object to call methods. Otherwise, do nothing and log the failure. Signed-off-by: Henry Wang --- vmm/src/device_manager.rs | 13 +++++++++---- vmm/src/vm.rs | 22 ++++++++++++++++------ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 93999e1be..4ee580de6 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -4147,14 +4147,19 @@ impl Pausable for DeviceManager { .get_gic_device() .unwrap(), ); - gic_device + if let Some(gicv3_its) = gic_device .lock() .unwrap() .as_any_concrete_mut() .downcast_mut::() - .unwrap() - .pause()?; - } + { + gicv3_its.pause()?; + } else { + return Err(MigratableError::Pause(anyhow!( + "GicDevice downcast to KvmGicV3Its failed when pausing device manager!" + ))); + }; + }; Ok(()) } diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index e7b963eab..b6c1216a3 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -2027,13 +2027,18 @@ impl Vm { .set_gicr_typers(&saved_vcpu_states); vm_snapshot.add_snapshot( - gic_device + if let Some(gicv3_its) = gic_device .lock() .unwrap() .as_any_concrete_mut() .downcast_mut::() - .unwrap() - .snapshot()?, + { + gicv3_its.snapshot()? + } else { + return Err(MigratableError::Snapshot(anyhow!( + "GicDevice downcast to KvmGicV3Its failed when snapshotting VM!" + ))); + }, ); Ok(()) @@ -2071,13 +2076,18 @@ impl Vm { // Restore GIC states. if let Some(gicv3_its_snapshot) = vm_snapshot.snapshots.get(GIC_V3_ITS_SNAPSHOT_ID) { - gic_device + if let Some(gicv3_its) = gic_device .lock() .unwrap() .as_any_concrete_mut() .downcast_mut::() - .unwrap() - .restore(*gicv3_its_snapshot.clone())?; + { + gicv3_its.restore(*gicv3_its_snapshot.clone())?; + } else { + return Err(MigratableError::Restore(anyhow!( + "GicDevice downcast to KvmGicV3Its failed when restoring VM!" + ))); + }; } else { return Err(MigratableError::Restore(anyhow!( "Missing GicV3Its snapshot"