[Pkg-gnupg-commit] [gnupg2] 26/166: scd: Fix release of transfer object.
Daniel Kahn Gillmor
dkg at fifthhorseman.net
Thu Mar 16 22:33:02 UTC 2017
This is an automated email from the git hooks/post-receive script.
dkg pushed a commit to branch experimental
in repository gnupg2.
commit f92fe33f11c44f14fd31682259fcd231e8fa9e75
Author: NIIBE Yutaka <gniibe at fsij.org>
Date: Fri Jan 27 20:43:29 2017 +0900
scd: Fix release of transfer object.
* scd/ccid-driver.c (intr_cb): Handle LIBUSB_TRANSFER_CANCELLED.
(do_close_reader): When callback is active, call
libusb_cancel_transfer and wait callback is fired off.
Signed-off-by: NIIBE Yutaka <gniibe at fsij.org>
---
scd/ccid-driver.c | 45 ++++++++++++++++++++++++++++-----------------
1 file changed, 28 insertions(+), 17 deletions(-)
diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c
index 1bb0fb2..cb4b4e6 100644
--- a/scd/ccid-driver.c
+++ b/scd/ccid-driver.c
@@ -262,9 +262,9 @@ struct ccid_driver_s
unsigned int auto_param:1;
unsigned int auto_pps:1;
unsigned int auto_ifsd:1;
- unsigned int powered_off:1;
unsigned int has_pinpad:2;
unsigned int enodev_seen:1;
+ int powered_off;
time_t last_progress; /* Last time we sent progress line. */
@@ -1764,12 +1764,17 @@ intr_cb (struct libusb_transfer *transfer)
DEBUGOUT_1 ("CCID: interrupt callback %d\n", transfer->status);
- if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE
- || transfer->status == LIBUSB_TRANSFER_ERROR)
+ if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT)
{
- device_removed:
- DEBUGOUT ("CCID: device removed\n");
- handle->powered_off = 1;
+ int err;
+
+ submit_again:
+ /* Submit the URB again to keep watching the INTERRUPT transfer. */
+ err = libusb_submit_transfer (transfer);
+ if (err == LIBUSB_ERROR_NO_DEVICE)
+ goto device_removed;
+
+ DEBUGOUT_1 ("CCID submit transfer again %d\n", err);
}
else if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
{
@@ -1782,19 +1787,17 @@ intr_cb (struct libusb_transfer *transfer)
}
else
{
- int err;
-
- /* Submit the URB again to keep watching the INTERRUPT transfer. */
- err = libusb_submit_transfer (transfer);
- if (err == LIBUSB_ERROR_NO_DEVICE)
- goto device_removed;
-
- DEBUGOUT_1 ("CCID submit transfer again %d\n", err);
+ /* Event other than card removal. */
+ goto submit_again;
}
}
+ else if (transfer->status == LIBUSB_TRANSFER_CANCELLED)
+ handle->powered_off = 1;
else
{
- DEBUGOUT_1 ("CCID intr_cb: %d\n", transfer->status);
+ device_removed:
+ DEBUGOUT ("CCID: device removed\n");
+ handle->powered_off = 1;
}
}
@@ -2048,11 +2051,19 @@ do_close_reader (ccid_driver_t handle)
if (!rc)
bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
seqno, 2000, 0);
- handle->powered_off = 1;
}
if (handle->idev)
{
- libusb_free_transfer (handle->transfer);
+ if (handle->transfer)
+ {
+ if (!handle->powered_off)
+ {
+ libusb_cancel_transfer (handle->transfer);
+ while (!handle->powered_off)
+ libusb_handle_events_completed (NULL, &handle->powered_off);
+ }
+ libusb_free_transfer (handle->transfer);
+ }
libusb_release_interface (handle->idev, handle->ifc_no);
libusb_close (handle->idev);
handle->idev = NULL;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gnupg2.git
More information about the Pkg-gnupg-commit
mailing list