summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Drake <dan@reactivated.net>2010-07-29 11:56:55 +0100
committerDaniel Drake <dan@reactivated.net>2010-07-29 11:56:55 +0100
commit30b5fbb87c76dfc00041404d11003e2ed068384b (patch)
treeb3d8eb0c750dd504c1b1cd0bdba64d368f73ea02
parentf1cc768c9f036f14d61d5fd6fc3061e7f2ba1ba0 (diff)
downloadlibusb-30b5fbb87c76dfc00041404d11003e2ed068384b.tar.gz
Fix libusb_init() error handling
9996ccaed7 introduced a problem in that mutexes could be destroyed in the error handling codepath before they had been created. Pointed out by Michael Plante.
-rw-r--r--libusb/core.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libusb/core.c b/libusb/core.c
index 28f9ddb..c39f33a 100644
--- a/libusb/core.c
+++ b/libusb/core.c
@@ -1523,14 +1523,14 @@ API_EXPORTED int LIBUSB_API libusb_init(libusb_context **context)
if (usbi_backend->init) {
r = usbi_backend->init(ctx);
if (r)
- goto err;
+ goto err_free_ctx;
}
r = usbi_io_init(ctx);
if (r < 0) {
if (usbi_backend->exit)
usbi_backend->exit();
- goto err;
+ goto err_destroy_mutex;
}
if (context) {
@@ -1544,12 +1544,13 @@ API_EXPORTED int LIBUSB_API libusb_init(libusb_context **context)
return 0;
-err:
+err_destroy_mutex:
if (usbi_default_context == ctx)
usbi_default_context = NULL;
usbi_mutex_static_unlock(&default_context_lock);
usbi_mutex_destroy(&ctx->open_devs_lock);
usbi_mutex_destroy(&ctx->usb_devs_lock);
+err_free_ctx:
free(ctx);
return r;
}