• L
    virtio-pci: fix virtio_pci_queue_enabled() · 0c9753eb
    Laurent Vivier 提交于
    In legacy mode, virtio_pci_queue_enabled() falls back to
    virtio_queue_enabled() to know if the queue is enabled.
    
    But virtio_queue_enabled() calls again virtio_pci_queue_enabled()
    if k->queue_enabled is set. This ends in a crash after a stack
    overflow.
    
    The problem can be reproduced with
    "-device virtio-net-pci,disable-legacy=off,disable-modern=true
     -net tap,vhost=on"
    
    And a look to the backtrace is very explicit:
    
        ...
        #4  0x000000010029a438 in virtio_queue_enabled ()
        #5  0x0000000100497a9c in virtio_pci_queue_enabled ()
        ...
        #130902 0x000000010029a460 in virtio_queue_enabled ()
        #130903 0x0000000100497a9c in virtio_pci_queue_enabled ()
        #130904 0x000000010029a460 in virtio_queue_enabled ()
        #130905 0x0000000100454a20 in vhost_net_start ()
        ...
    
    This patch fixes the problem by introducing a new function
    for the legacy case and calls it from virtio_pci_queue_enabled().
    It also calls it from virtio_queue_enabled() to avoid code duplication.
    
    Fixes: f19bcdfe ("virtio-pci: implement queue_enabled method")
    Cc: Jason Wang <jasowang@redhat.com>
    Cc: Cindy Lu <lulu@redhat.com>
    CC: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: NLaurent Vivier <lvivier@redhat.com>
    Message-Id: <20200727153319.43716-1-lvivier@redhat.com>
    Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    0c9753eb
virtio-pci.c 67.2 KB