summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Hjelm <hjelmn@google.com>2019-08-13 21:11:15 -0700
committerNathan Hjelm <hjelmn@google.com>2019-08-13 21:22:48 -0700
commitafadbc7a89f49b70a09d0d809853777ce3a135bf (patch)
tree11e1e75439095df39654a954bdf2a87ef9894931
parenta5990ab10f68e5ec7498f627d1664b1f842fec4e (diff)
downloadlibusb-afadbc7a89f49b70a09d0d809853777ce3a135bf.tar.gz
core: abandon sync transfers after libusb_close()
This commit adds an additional check to synchronous transfer progression to prevent accessing a potentially deleted context. This access can occur if a code calls libusb_close() then libusb_exit() from one thread while another thread is in a synchronous transfer. Note that this is likely a user error. The application should wait for all transfers to complete before calling libusb_close(). This commit is being offered as a best-effort attempt to prevent the invalid access and return a useful error to the application. There may still be a window where an invalid access is possible. This commit is a work around until a better fix is available. References #610 Signed-off-by: Nathan Hjelm <hjelmn@google.com>
-rw-r--r--libusb/sync.c8
-rw-r--r--libusb/version_nano.h2
2 files changed, 9 insertions, 1 deletions
diff --git a/libusb/sync.c b/libusb/sync.c
index a609f65..70942ac 100644
--- a/libusb/sync.c
+++ b/libusb/sync.c
@@ -1,6 +1,9 @@
+/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */
/*
* Synchronous I/O functions for libusb
* Copyright © 2007-2008 Daniel Drake <dsd@gentoo.org>
+ * Copyright © 2019 Nathan Hjelm <hjelmn@cs.unm.edu>
+ * Copyright © 2019 Google LLC. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -57,6 +60,11 @@ static void sync_transfer_wait_for_completion(struct libusb_transfer *transfer)
libusb_cancel_transfer(transfer);
continue;
}
+ if (NULL == transfer->dev_handle) {
+ /* transfer completion after libusb_close() */
+ transfer->status = LIBUSB_ERROR_NO_DEVICE;
+ *completed = 1;
+ }
}
}
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 8aa1efc..1ff7ca7 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11389
+#define LIBUSB_NANO 11390