From d8a55da715ce8447b0686f321fa43d00be34a467 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 21 Jul 2017 13:26:53 +0900 Subject: scd: Fix SEGV in CCID driver. * scd/ccid-driver.c (intr_cb): Only kick the loop for removal. (bulk_in): Don't set POWERED_OFF when interrupt transfer is enabled. Signed-off-by: NIIBE Yutaka --- scd/ccid-driver.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index ce6133f80..9c22f5188 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -1487,6 +1487,7 @@ intr_cb (struct libusb_transfer *transfer) { DEBUGOUT ("CCID: card removed\n"); handle->powered_off = 1; + scd_kick_the_loop (); } else { @@ -1501,9 +1502,8 @@ intr_cb (struct libusb_transfer *transfer) device_removed: DEBUGOUT ("CCID: device removed\n"); handle->powered_off = 1; + scd_kick_the_loop (); } - - scd_kick_the_loop (); } static void @@ -2043,8 +2043,11 @@ bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length, * Possibly, it was forcibly suspended and resumed. */ DEBUGOUT ("CCID: card inactive/removed\n"); - handle->powered_off = 1; - scd_kick_the_loop (); + if (handle->transfer == NULL) + { + handle->powered_off = 1; + scd_kick_the_loop (); + } } return rc; -- cgit v1.2.3