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>
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 @@
 			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