Blame SOURCES/0009-core-Do-not-attempt-to-destroy-a-default-context-tha.patch

d5e699
From d414a9c447c79b0e39587998f71f8576605b4fb4 Mon Sep 17 00:00:00 2001
d5e699
From: Chris Dickens <christopher.a.dickens@gmail.com>
d5e699
Date: Mon, 13 Jan 2020 15:05:00 -0800
d5e699
Subject: [PATCH 09/10] core: Do not attempt to destroy a default context that
d5e699
 doesn't exist
d5e699
d5e699
Calling libusb_exit(NULL) when a successful call to libusb_init(NULL)
d5e699
has not been made results in a segmentation violation. This is
d5e699
definitely a user error, but we can easily guard against it.
d5e699
d5e699
Closes #511
d5e699
d5e699
Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
d5e699
(cherry picked from commit a5624b22267ec0e146825d3fe94d9e4b2f5ae503)
d5e699
---
d5e699
 libusb/core.c         | 16 +++++++++++-----
d5e699
 libusb/version_nano.h |  2 +-
d5e699
 2 files changed, 12 insertions(+), 6 deletions(-)
d5e699
d5e699
diff --git a/libusb/core.c b/libusb/core.c
d5e699
index 5c0a2e0..26df871 100644
d5e699
--- a/libusb/core.c
d5e699
+++ b/libusb/core.c
d5e699
@@ -2305,7 +2305,7 @@ int API_EXPORTED libusb_init(libusb_context **context)
d5e699
 	usbi_mutex_static_lock(&active_contexts_lock);
d5e699
 	if (first_init) {
d5e699
 		first_init = 0;
d5e699
-		list_init (&active_contexts_list);
d5e699
+		list_init(&active_contexts_list);
d5e699
 	}
d5e699
 	list_add (&ctx->list, &active_contexts_list);
d5e699
 	usbi_mutex_static_unlock(&active_contexts_lock);
d5e699
@@ -2337,7 +2337,7 @@ err_free_ctx:
d5e699
 	}
d5e699
 
d5e699
 	usbi_mutex_static_lock(&active_contexts_lock);
d5e699
-	list_del (&ctx->list);
d5e699
+	list_del(&ctx->list);
d5e699
 	usbi_mutex_static_unlock(&active_contexts_lock);
d5e699
 
d5e699
 	usbi_mutex_lock(&ctx->usb_devs_lock);
d5e699
@@ -2375,6 +2375,12 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx)
d5e699
 	 * if we're the last user */
d5e699
 	usbi_mutex_static_lock(&default_context_lock);
d5e699
 	if (ctx == usbi_default_context) {
d5e699
+		if (!usbi_default_context) {
d5e699
+			usbi_dbg("no default context, not initialized?");
d5e699
+			usbi_mutex_static_unlock(&default_context_lock);
d5e699
+			return;
d5e699
+		}
d5e699
+
d5e699
 		if (--default_context_refcnt > 0) {
d5e699
 			usbi_dbg("not destroying default context");
d5e699
 			usbi_mutex_static_unlock(&default_context_lock);
d5e699
@@ -2390,12 +2396,12 @@ void API_EXPORTED libusb_exit(struct libusb_context *ctx)
d5e699
 		 */
d5e699
 		destroying_default_context = 1;
d5e699
 	} else {
d5e699
-		// Unlock default context, as we're not modifying it.
d5e699
+		/* Unlock default context, as we're not modifying it. */
d5e699
 		usbi_mutex_static_unlock(&default_context_lock);
d5e699
-  }
d5e699
+	}
d5e699
 
d5e699
 	usbi_mutex_static_lock(&active_contexts_lock);
d5e699
-	list_del (&ctx->list);
d5e699
+	list_del(&ctx->list);
d5e699
 	usbi_mutex_static_unlock(&active_contexts_lock);
d5e699
 
d5e699
 	if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
d5e699
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
d5e699
index 57c2b1d..3247cec 100644
d5e699
--- a/libusb/version_nano.h
d5e699
+++ b/libusb/version_nano.h
d5e699
@@ -1 +1 @@
d5e699
-#define LIBUSB_NANO 11426
d5e699
+#define LIBUSB_NANO 11427
d5e699
-- 
d5e699
2.26.1
d5e699