core: Suppress hotplug events during initial enumeration 50/290950/1 accepted/tizen_8.0_unified accepted/tizen_unified tizen tizen_8.0 accepted/tizen/8.0/unified/20231005.095128 accepted/tizen/unified/20230406.165731 tizen_8.0_m2_release
authorBenjamin Berg <bberg@redhat.com>
Tue, 1 Mar 2022 14:08:38 +0000 (15:08 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 5 Apr 2023 09:09:00 +0000 (11:09 +0200)
The initial enumeration should not result in hotplug events to be fired.
This is just a convenience though, API users still need to be prepared
to be notified a second time for a device that was plugged in between
libusb_init and libusb_hotplug_register_callback.

This regressed with commit 6929b82 ("Fix segmentation fault in
libusb_init() if usbi_backend.init() fails"). This commit avoids the
mentioned segmentation fault by avoiding to clean up the hotplug code if
it was not yet initialised.

Fixes #1082
Closes #1090
References #989

[Cherrypick from mainline commit 0846456 ("core: Suppress hotplug events during initial enumeration")]
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: Idbae2c394ba01694f9e6006d8a52036f6c73da77

libusb/core.c
libusb/hotplug.c
libusb/version_nano.h

index 1c1ada1..3559470 100644 (file)
@@ -2346,14 +2346,15 @@ int API_EXPORTED libusb_init(libusb_context **ctx)
        list_add(&_ctx->list, &active_contexts_list);
        usbi_mutex_static_unlock(&active_contexts_lock);
 
-       usbi_hotplug_init(_ctx);
-
        if (usbi_backend.init) {
                r = usbi_backend.init(_ctx);
                if (r)
                        goto err_io_exit;
        }
 
+       /* Initialize hotplug after the initial enumeration is done. */
+       usbi_hotplug_init(_ctx);
+
        if (ctx)
                *ctx = _ctx;
 
index 402e693..6b743c7 100644 (file)
@@ -171,6 +171,9 @@ void usbi_hotplug_exit(struct libusb_context *ctx)
        if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG))
                return;
 
+       if (!usbi_atomic_load(&ctx->hotplug_ready))
+               return;
+
        /* free all registered hotplug callbacks */
        for_each_hotplug_cb_safe(ctx, hotplug_cb, next_cb) {
                list_del(&hotplug_cb->list);
index 7bf6ace..10c3ecf 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11694
+#define LIBUSB_NANO 11695