summaryrefslogtreecommitdiff
path: root/libusb/core.c
diff options
context:
space:
mode:
authorPete Batard <pbatard@gmail.com>2010-05-17 19:16:54 -0300
committerDaniel Drake <dan@reactivated.net>2010-05-17 19:30:07 -0300
commit9996ccaed740f8fcec4287a478ccaaa573f9865a (patch)
tree2d556fc8b9d65a71804ee458389dc815332b23b3 /libusb/core.c
parent371ca4e440894bd1c845971418aa24c9d3919e63 (diff)
downloadlibusbx-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.c14
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);
}