hotplug: Don't call the user callback while holding various locks
commitbe76bef5b716d27b78fba120d3f9b815ed3380b9
authorHans de Goede <hdegoede@redhat.com>
Wed, 21 Aug 2013 12:18:09 +0000 (21 14:18 +0200)
committerHans de Goede <hdegoede@redhat.com>
Wed, 21 Aug 2013 12:18:09 +0000 (21 14:18 +0200)
tree5ae750f018b696bee367c3324e7aa1ea6b28f448
parentfad4a18c8a55947a9c4f1a427427b176e053a991
hotplug: Don't call the user callback while holding various locks

Calling user callbacks with locks held is a bad idea and should be avoided
whenever possible. Before this patch this could lead ie to the following hang:

1) User calls libusb_hotplug_register_callback with the
   LIBUSB_HOTPLUG_ENUMERATE flag
2) libusb_hotplug_register_callback calls the user callback while holding the
   hotplug_cbs_lock
3) The callback calls a synchronous libusb function
4) The synchronous libusb function calls libusb_handle_events
5) There is an hotplug event waiting in the hotplug pipe and
   libusb_handle_events calls usbi_hotplug_match
6) usbi_hotplug_match tries to take the lock a 2nd time
7) hang / assert / abort (depending on the platform)

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