core: set default backend options before calling backend init
authorNathan Hjelm <hjelmn@google.com>
Tue, 27 Jul 2021 05:23:12 +0000 (23:23 -0600)
committerNathan Hjelm <hjelmn@google.com>
Tue, 27 Jul 2021 05:23:12 +0000 (23:23 -0600)
This commit restores the previous behavior with regards to setting some backend options and
restores the ability to set default context options before libusb_init. None of the backends
use anything set in init in their set_option function so this should be safe with all
backends and options.

References #942

Signed-off-by: Nathan Hjelm <hjelmn@google.com>
libusb/core.c
libusb/version_nano.h

index 4ec410b..f0844bf 100644 (file)
@@ -2308,21 +2308,30 @@ int API_EXPORTED libusb_init(libusb_context **ctx)
                _ctx->debug_fixed = 1;
 #endif
 
+       usbi_mutex_init(&_ctx->usb_devs_lock);
+       usbi_mutex_init(&_ctx->open_devs_lock);
+       list_init(&_ctx->usb_devs);
+       list_init(&_ctx->open_devs);
+
        /* default context should be initialized before calling usbi_dbg */
        if (!ctx) {
                usbi_default_context = _ctx;
                default_context_refcnt = 1;
                usbi_dbg(usbi_default_context, "created default context");
+
+               for (enum libusb_option option = 0 ; option < LIBUSB_OPTION_MAX ; option++) {
+                       if (LIBUSB_OPTION_LOG_LEVEL == option || !default_context_options[option].is_set) {
+                               continue;
+                       }
+                       r = libusb_set_option(_ctx, option);
+                       if (LIBUSB_SUCCESS != r)
+                               goto err_free_ctx;
+               }
        }
 
        usbi_dbg(_ctx, "libusb v%u.%u.%u.%u%s", libusb_version_internal.major, libusb_version_internal.minor,
                libusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc);
 
-       usbi_mutex_init(&_ctx->usb_devs_lock);
-       usbi_mutex_init(&_ctx->open_devs_lock);
-       list_init(&_ctx->usb_devs);
-       list_init(&_ctx->open_devs);
-
        r = usbi_io_init(_ctx);
        if (r < 0) {
                usbi_mutex_static_unlock(&default_context_lock);
@@ -2341,16 +2350,7 @@ int API_EXPORTED libusb_init(libusb_context **ctx)
 
        usbi_hotplug_init(_ctx);
 
-       if (!ctx) {
-               for (enum libusb_option option = 0 ; option < LIBUSB_OPTION_MAX ; option++) {
-                       if (LIBUSB_OPTION_LOG_LEVEL == option || !default_context_options[option].is_set) {
-                               continue;
-                       }
-                       r = libusb_set_option(_ctx, option);
-                       if (LIBUSB_SUCCESS != r)
-                               goto err_io_exit;
-               }
-       } else
+       if (ctx)
                *ctx = _ctx;
 
        usbi_mutex_static_unlock(&default_context_lock);
index 88f37e6..a2c106c 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11645
+#define LIBUSB_NANO 11646