core: Only do hotplug cleanup for hotplug capable backends
authorHans de Goede <hdegoede@redhat.com>
Wed, 26 Jun 2013 14:50:56 +0000 (16:50 +0200)
committerHans de Goede <hdegoede@redhat.com>
Wed, 26 Jun 2013 15:11:27 +0000 (17:11 +0200)
commit163e2083e290eb878f4e38b17daf5998a7a29c47
treec3c7adb4255aa780e7e80771061ce9311f240d6b
parentc1bf7fbab0ed2b5606ff0d50cde2896d0ac2f4ff
core: Only do hotplug cleanup for hotplug capable backends

Xiaofan encountered a crash while testing on openbsd. The main problem here is
libusb_exit doing hotplug cleanup on a non hotplug capable backend.

If the usb_devs list is non empty (*) at libusb_exit time with a non hotplug
capable backend, then the hotplug cleanup code will unref the devices
in the list. Assuming this is the last unref, then libusb_unref_device
will call usbi_disconnect_device, which will try to take the usb_devs_lock,
which is already hold by libusb_exit. Note that if this deadlock was not
there, that we then also would have a double list_del issue.

*) This should never happen, if it does either libusb or the app has a memleak,
or the app still holds a reference to the device. The latter is an application
bug, since device->ctx will be invalid after libusb_exit, so the application
should not hold references after calling libusb_exit.

In this case we have a memleak the libusb openbsd code causing the usb_devs
list to be non empty. This will be fixed in another commit.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
libusb/core.c
libusb/version_nano.h