]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
virtio: rng: disallow multiple device registrations, fixes crashes
authorAmit Shah <amit.shah@redhat.com>
Fri, 8 Mar 2013 00:30:18 +0000 (11:30 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Mar 2013 19:58:50 +0000 (12:58 -0700)
commit e84e7a56a3aa2963db506299e29a5f3f09377f9b upstream.

The code currently only supports one virtio-rng device at a time.
Invoking guests with multiple devices causes the guest to blow up.

Check if we've already registered and initialised the driver.  Also
cleanup in case of registration errors or hot-unplug so that a new
device can be used.

Reported-by: Peter Krempa <pkrempa@redhat.com>
Reported-by: <yunzheng@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/char/hw_random/virtio-rng.c

index 75f1cbd61c174b36f1e637b59d203980e61c8cac..ca7570df05af668af9bc1ea6a4f917734ceadc2b 100644 (file)
@@ -88,14 +88,22 @@ static int virtrng_probe(struct virtio_device *vdev)
 {
        int err;
 
+       if (vq) {
+               /* We only support one device for now */
+               return -EBUSY;
+       }
        /* We expect a single virtqueue. */
        vq = virtio_find_single_vq(vdev, random_recv_done, "input");
-       if (IS_ERR(vq))
-               return PTR_ERR(vq);
+       if (IS_ERR(vq)) {
+               err = PTR_ERR(vq);
+               vq = NULL;
+               return err;
+       }
 
        err = hwrng_register(&virtio_hwrng);
        if (err) {
                vdev->config->del_vqs(vdev);
+               vq = NULL;
                return err;
        }
 
@@ -107,6 +115,7 @@ static void __devexit virtrng_remove(struct virtio_device *vdev)
        vdev->config->reset(vdev);
        hwrng_unregister(&virtio_hwrng);
        vdev->config->del_vqs(vdev);
+       vq = NULL;
 }
 
 static struct virtio_device_id id_table[] = {