diff options
author | Daniel Drake <dan@reactivated.net> | 2010-07-29 11:56:55 +0100 |
---|---|---|
committer | Daniel Drake <dan@reactivated.net> | 2010-07-29 11:56:55 +0100 |
commit | 30b5fbb87c76dfc00041404d11003e2ed068384b (patch) | |
tree | b3d8eb0c750dd504c1b1cd0bdba64d368f73ea02 | |
parent | f1cc768c9f036f14d61d5fd6fc3061e7f2ba1ba0 (diff) | |
download | libusb-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.c | 7 |
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; } |