We might not get a valid pci device from pci_get_slot(), and thus panic:
[ 95.167003] RIP: 0010:[<ffffffffa000178f>] [<ffffffffa000178f>] jailhouse_pci_do_all_devices+0xaf/0x1a0 [jailhouse]
...
[ 95.167003] [<ffffffffa0000363>] jailhouse_cell_delete_all+0x33/0xd0 [jailhouse]
[ 95.167003] [<ffffffffa0000be5>] jailhouse_cmd_disable+0xe5/0x120 [jailhouse]
[ 95.167003] [<ffffffffa00011d5>] jailhouse_ioctl+0x65/0x90 [jailhouse]
...
Fix by verifying for non-null device.
Signed-off-by: Veaceslav Falico <
veacesla...@huawei.com>
---
Notes:
Reproduced easily:
tools/jailhouse enable configs/qemu-vm.cell
tools/jailhouse cell create configs/tiny-demo.cell
tools/jailhouse cell load tiny-demo inmates/demos/x86/32-bit-demo.bin -a 0xf0000
tools/jailhouse cell start tiny-demo
tools/jailhouse disable
with qemu 2.3.90:
sudo /usr/local/bin/qemu-system-x86_64 \
-m 1G -drive file=$WD/fed22.img,if=virtio -smp 4 \
-name jailhouse -machine q35 -enable-kvm \
-cpu kvm64,-kvm_pv_eoi,-kvm_steal_time,-kvm_asyncpf,-kvmclock,+vmx,+x2apic \
-virtfs local,path=/home/vfalico/git/,mount_tag=git,security_model=none -s \
-netdev type=tap,script=$WD/qemu-ifup.sh,downscript=no,id=net0 \
-device virtio-net-pci,netdev=net0 \
-serial vc -serial vc
driver/pci.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/driver/pci.c b/driver/pci.c
index 24158ac..6fcf7de 100644
--- a/driver/pci.c
+++ b/driver/pci.c
@@ -86,6 +86,8 @@ static void jailhouse_pci_claim_release(const struct jailhouse_pci_device *dev,
if (!bus)
return;
l_dev = pci_get_slot(bus, dev->bdf & 0xff);
+ if (!l_dev)
+ return;
drv = l_dev->dev.driver;
if (action == JAILHOUSE_PCI_ACTION_CLAIM) {
--
2.4.3