OSDN Git Service

net: do not delete nics in net_cleanup()
authorDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 15 Nov 2023 17:24:35 +0000 (17:24 +0000)
committerJason Wang <jasowang@redhat.com>
Tue, 21 Nov 2023 07:42:34 +0000 (15:42 +0800)
commit84f85eb95f14add02efd5e69f2ff7783d79b24f7
treeb3198adca6490b2f0d206bf3877a69f2b7bc8073
parent9050f976e447444ea6ee2ba12c9f77e4b0dc54bc
net: do not delete nics in net_cleanup()

In net_cleanup() we only need to delete the netdevs, as those may have
state which outlives Qemu when it exits, and thus may actually need to
be cleaned up on exit.

The nics, on the other hand, are owned by the device which created them.
Most devices don't bother to clean up on exit because they don't have
any state which will outlive Qemu... but XenBus devices do need to clean
up their nodes in XenStore, and do have an exit handler to delete them.

When the XenBus exit handler destroys the xen-net-device, it attempts
to delete its nic after net_cleanup() had already done so. And crashes.

Fix this by only deleting netdevs as we walk the list. As the comment
notes, we can't use QTAILQ_FOREACH_SAFE() as each deletion may remove
*multiple* entries, including the "safely" saved 'next' pointer. But
we can store the *previous* entry, since nics are safe.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
Signed-off-by: Jason Wang <jasowang@redhat.com>
net/net.c