Skip to content

Commit f466f75

Browse files
asiasrustyrussell
authored andcommitted
virtio-scsi: Fix hotcpu_notifier use-after-free with virtscsi_freeze
vqs are freed in virtscsi_freeze but the hotcpu_notifier is not unregistered. We will have a use-after-free usage when the notifier callback is called after virtscsi_freeze. Fixes: 285e71e ("virtio-scsi: reset virtqueue affinity when doing cpu hotplug") Cc: [email protected] Signed-off-by: Asias He <[email protected]> Reviewed-by: Paolo Bonzini <[email protected]> Signed-off-by: Jason Wang <[email protected]> Signed-off-by: Rusty Russell <[email protected]>
1 parent 7d2dddd commit f466f75

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

drivers/scsi/virtio_scsi.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,10 @@ static void virtscsi_remove(struct virtio_device *vdev)
956956
#ifdef CONFIG_PM_SLEEP
957957
static int virtscsi_freeze(struct virtio_device *vdev)
958958
{
959+
struct Scsi_Host *sh = virtio_scsi_host(vdev);
960+
struct virtio_scsi *vscsi = shost_priv(sh);
961+
962+
unregister_hotcpu_notifier(&vscsi->nb);
959963
virtscsi_remove_vqs(vdev);
960964
return 0;
961965
}
@@ -964,8 +968,17 @@ static int virtscsi_restore(struct virtio_device *vdev)
964968
{
965969
struct Scsi_Host *sh = virtio_scsi_host(vdev);
966970
struct virtio_scsi *vscsi = shost_priv(sh);
971+
int err;
972+
973+
err = virtscsi_init(vdev, vscsi);
974+
if (err)
975+
return err;
976+
977+
err = register_hotcpu_notifier(&vscsi->nb);
978+
if (err)
979+
vdev->config->del_vqs(vdev);
967980

968-
return virtscsi_init(vdev, vscsi);
981+
return err;
969982
}
970983
#endif
971984

0 commit comments

Comments
 (0)