From: Patrick Stewart Date: Wed, 31 Jan 2018 15:18:06 +0000 (+0000) Subject: Windows: Fix race condition between submit and handle events X-Git-Tag: upstream/1.0.22~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=32617df7143c58a204e130f6c65f5226a2ea046e;p=platform%2Fupstream%2Flibusb.git Windows: Fix race condition between submit and handle events Check the event object for completion in poll instead of using HasOverlappedIoCompleted. When we submit a transfer on Windows the fd is added to the poll list before the read/write begins, so HasOverlappedIoCompleted can be called before overlapped.Internal is set to ERROR_IO_PENDING if events are being being handled concurrently, so the fd will be marked as completed before it has actually started. [dickens] Instead of replacing HasOverlappedIoCompleted, supplement it so that it can provide a fast path to avoid WaitForSingleObject() in the general case Closes #386, Closes #387 Signed-off-by: Chris Dickens --- diff --git a/libusb/os/poll_windows.c b/libusb/os/poll_windows.c index 654965b..bb3d178 100644 --- a/libusb/os/poll_windows.c +++ b/libusb/os/poll_windows.c @@ -149,8 +149,8 @@ static int check_pollfds(struct pollfd *fds, unsigned int nfds, continue; } - // The following macro only works if overlapped I/O was reported pending - if (HasOverlappedIoCompleted(&fd->overlapped)) { + if (HasOverlappedIoCompleted(&fd->overlapped) + && (WaitForSingleObject(fd->overlapped.hEvent, 0) == WAIT_OBJECT_0)) { fds[n].revents = fds[n].events; nready++; } else if (wait_handles != NULL) { diff --git a/libusb/version_nano.h b/libusb/version_nano.h index e40a0dd..eb2eab4 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 11298 +#define LIBUSB_NANO 11299