[Pcsclite-git-commit] [CCID] 01/01: ccid_usb.c: fix a race condition on multi reader

Ludovic Rousseau rousseau at moszumanska.debian.org
Fri Apr 22 17:10:59 UTC 2016


This is an automated email from the git hooks/post-receive script.

rousseau pushed a commit to branch master
in repository CCID.

commit 2c8ffab9962484653b6445a6c85a6c690a5948b3
Author: Ludovic Rousseau <ludovic.rousseau at free.fr>
Date:   Fri Apr 22 14:59:21 2016 +0200

    ccid_usb.c: fix a race condition on multi reader
    
    When using multiple threads we shall use libusb function
    libusb_handle_events_completed() instead of libusb_handle_events() as
    documented in http://libusb.sourceforge.net/api-1.0/mtasync.html#Using
    
    Problems may occur when using more than one reader. In that case a card
    movement notification may be missed and reported only after a 60 seconds
    timeout.
    
    Thanks to Maksim Ivanov for the bug report
    "CCID handling of multiple devices"
    http://lists.alioth.debian.org/pipermail/pcsclite-muscle/Week-of-Mon-20160418/000564.html
---
 src/ccid_usb.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/ccid_usb.c b/src/ccid_usb.c
index 6a097ea..16e870d 100644
--- a/src/ccid_usb.c
+++ b/src/ccid_usb.c
@@ -1251,14 +1251,14 @@ int InterruptRead(int reader_index, int timeout /* in ms */)
 
 	while (!completed)
 	{
-		ret = libusb_handle_events(ctx);
+		ret = libusb_handle_events_completed(ctx, &completed);
 		if (ret < 0)
 		{
 			if (ret == LIBUSB_ERROR_INTERRUPTED)
 				continue;
 			libusb_cancel_transfer(transfer);
 			while (!completed)
-				if (libusb_handle_events(ctx) < 0)
+				if (libusb_handle_events_completed(ctx, &completed) < 0)
 					break;
 			libusb_free_transfer(transfer);
 			DEBUG_CRITICAL2("libusb_handle_events failed: %s",
@@ -1378,7 +1378,7 @@ static void *Multi_PollingProc(void *p_ext)
 		completed = 0;
 		while (!completed && !msExt->terminated)
 		{
-			rv = libusb_handle_events(ctx);
+			rv = libusb_handle_events_completed(ctx, &completed);
 			if (rv < 0)
 			{
 				DEBUG_COMM2("libusb_handle_events err %d", rv);
@@ -1390,7 +1390,7 @@ static void *Multi_PollingProc(void *p_ext)
 
 				while (!completed && !msExt->terminated)
 				{
-					if (libusb_handle_events(ctx) < 0)
+					if (libusb_handle_events_completed(ctx, &completed) < 0)
 						break;
 				}
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pcsclite/CCID.git



More information about the Pcsclite-cvs-commit mailing list