diff options
author | Pete Batard <pbatard@gmail.com> | 2010-05-17 19:16:54 -0300 |
---|---|---|
committer | Daniel Drake <dan@reactivated.net> | 2010-05-17 19:30:07 -0300 |
commit | 9996ccaed740f8fcec4287a478ccaaa573f9865a (patch) | |
tree | 2d556fc8b9d65a71804ee458389dc815332b23b3 /libusb/core.c | |
parent | 371ca4e440894bd1c845971418aa24c9d3919e63 (diff) | |
download | libusbx-9996ccaed740f8fcec4287a478ccaaa573f9865a.tar.gz |
Fixes to error handling and exit codepaths
Various locks and things were being leaked/left open when handling
errors and during deinitialization.
[dsd: small tweaks]
Diffstat (limited to 'libusb/core.c')
-rw-r--r-- | libusb/core.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/libusb/core.c b/libusb/core.c index efae9aa..3ffeb19 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -507,8 +507,10 @@ struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, return NULL; r = usbi_mutex_init(&dev->lock, NULL); - if (r) + if (r) { + free(dev); return NULL; + } dev->ctx = ctx; dev->refcnt = 1; @@ -869,8 +871,10 @@ API_EXPORTED int libusb_open(libusb_device *dev, libusb_device_handle **handle) return LIBUSB_ERROR_NO_MEM; r = usbi_mutex_init(&_handle->lock, NULL); - if (r) + if (r) { + free(_handle); return LIBUSB_ERROR_OTHER; + } _handle->dev = libusb_ref_device(dev); _handle->claimed_interfaces = 0; @@ -879,6 +883,7 @@ API_EXPORTED int libusb_open(libusb_device *dev, libusb_device_handle **handle) r = usbi_backend->open(_handle); if (r < 0) { libusb_unref_device(dev); + usbi_mutex_destroy(&_handle->lock); free(_handle); return r; } @@ -990,6 +995,7 @@ static void do_close(struct libusb_context *ctx, usbi_backend->close(dev_handle); libusb_unref_device(dev_handle->dev); + usbi_mutex_destroy(&dev_handle->lock); free(dev_handle); } @@ -1501,6 +1507,8 @@ API_EXPORTED int libusb_init(libusb_context **context) return 0; err: + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); free(ctx); return r; } @@ -1531,6 +1539,8 @@ API_EXPORTED void libusb_exit(struct libusb_context *ctx) } usbi_mutex_static_unlock(&default_context_lock); + usbi_mutex_destroy(&ctx->open_devs_lock); + usbi_mutex_destroy(&ctx->usb_devs_lock); free(ctx); } |