From ac65af06692891b6bac6506cdc22018eb0d12adf Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Sat, 3 Oct 2015 12:48:56 +0200 Subject: [PATCH 1/2] Fixes unreleased locks with pcsc-lite This is a bug in PCSC-Lite propably won't be fixed, see https://alioth.debian.org/tracker/index.php?func=detail&aid=315083&group_id=30105&atid=410088 Fixes https://github.com/OpenSC/OpenSC/issues/480 Closes https://github.com/OpenSC/OpenSC/pull/487 --- configure.ac | 1 + src/libopensc/reader-pcsc.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 8705c6fb..37b330f0 100644 --- a/configure.ac +++ b/configure.ac @@ -576,6 +576,7 @@ if test "${enable_pcsc}" = "yes"; then CFLAGS="${CFLAGS} ${PCSC_CFLAGS}" # We must cope with mingw32 that does not have winscard.h mingw64 has it. AC_CHECK_HEADERS([winscard.h],,[test "${WIN32}" != "yes" && AC_MSG_ERROR([winscard.h is required for pcsc])]) + AC_CHECK_HEADERS([pcsclite.h]) CFLAGS="${saved_CFLAGS}" if test "${with_pcsc_provider}" = "detect"; then diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index de137959..a2dff7cf 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -431,8 +431,10 @@ static int pcsc_reconnect(sc_reader_t * reader, DWORD action) if (check_forced_protocol(reader->ctx, &reader->atr, &tmp)) protocol = tmp; - /* reconnect always unlocks transaction */ +#ifndef HAVE_PCSCLITE_H + /* reconnect unlocks transaction everywhere but in PCSC-lite */ priv->locked = 0; +#endif rv = priv->gpriv->SCardReconnect(priv->pcsc_card, priv->gpriv->connect_exclusive ? SCARD_SHARE_EXCLUSIVE : SCARD_SHARE_SHARED, @@ -588,17 +590,21 @@ static int pcsc_release(sc_reader_t *reader) static int pcsc_reset(sc_reader_t *reader, int do_cold_reset) { - struct pcsc_private_data *priv = GET_PRIV_DATA(reader); int r; +#ifndef HAVE_PCSCLITE_H + struct pcsc_private_data *priv = GET_PRIV_DATA(reader); int old_locked = priv->locked; +#endif r = pcsc_reconnect(reader, do_cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD); if(r != SC_SUCCESS) return r; - /* pcsc_reconnect unlocks card... try to lock it again if it was locked */ +#ifndef HAVE_PCSCLITE_H + /* reconnect unlocks transaction everywhere but in PCSC-lite */ if(old_locked) r = pcsc_lock(reader); +#endif return r; } From da1d4cc78a3f150761c4d636aec98f7698c91687 Mon Sep 17 00:00:00 2001 From: Frank Morgner Date: Wed, 7 Oct 2015 17:55:53 +0200 Subject: [PATCH 2/2] Fix locking issue on OS X Works around Apple shipping PCSC-Lite headers without PCSC-Lite. Let's say they do it for "backward compatibility"... --- MacOSX/build-package.in | 4 ++-- src/libopensc/reader-pcsc.c | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/MacOSX/build-package.in b/MacOSX/build-package.in index 04bd47e8..f3c4008c 100755 --- a/MacOSX/build-package.in +++ b/MacOSX/build-package.in @@ -1,6 +1,6 @@ #!/bin/bash # Building the installer is only tested and supported on 10.9+ with Xcode 6.0.1 -# Built package targets 10.9+ +# Built package targets 10.10 # Building should also work on older versions with older revisions or slight changes, YMMV # You need to have the following from homebrew or macports or fink: @@ -15,7 +15,7 @@ SDKS_PATH="$(xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs" SDK_PATH="${SDK_PATH:-$SDKS_PATH/$(ls -1 ${SDKS_PATH} | sort -n -k2 -t. -r | head -1)}" # Set SDK path -export CFLAGS="-isysroot $SDK_PATH -arch i386 -arch x86_64 -mmacosx-version-min=10.7" +export CFLAGS="-isysroot $SDK_PATH -arch i386 -arch x86_64 -mmacosx-version-min=10.10" # OpenSSL is deprecated on OSX since 10.7 and that generates lots of # "false positive" warnings and there is no alternative option. diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index a2dff7cf..4da20253 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -41,6 +41,12 @@ #include "pace.h" +#ifdef HAVE_PCSCLITE_H +#if !defined (__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < 101000 +#define HAVE_PCSCLITE 1 +#endif +#endif + /* Logging */ #define PCSC_TRACE(reader, desc, rv) do { sc_log(reader->ctx, "%s:" desc ": 0x%08lx\n", reader->name, rv); } while (0) #define PCSC_LOG(ctx, desc, rv) do { sc_log(ctx, desc ": 0x%08lx\n", rv); } while (0) @@ -431,7 +437,7 @@ static int pcsc_reconnect(sc_reader_t * reader, DWORD action) if (check_forced_protocol(reader->ctx, &reader->atr, &tmp)) protocol = tmp; -#ifndef HAVE_PCSCLITE_H +#ifndef HAVE_PCSCLITE /* reconnect unlocks transaction everywhere but in PCSC-lite */ priv->locked = 0; #endif @@ -591,7 +597,7 @@ static int pcsc_release(sc_reader_t *reader) static int pcsc_reset(sc_reader_t *reader, int do_cold_reset) { int r; -#ifndef HAVE_PCSCLITE_H +#ifndef HAVE_PCSCLITE struct pcsc_private_data *priv = GET_PRIV_DATA(reader); int old_locked = priv->locked; #endif @@ -600,7 +606,7 @@ static int pcsc_reset(sc_reader_t *reader, int do_cold_reset) if(r != SC_SUCCESS) return r; -#ifndef HAVE_PCSCLITE_H +#ifndef HAVE_PCSCLITE /* reconnect unlocks transaction everywhere but in PCSC-lite */ if(old_locked) r = pcsc_lock(reader); @@ -2492,4 +2498,3 @@ struct sc_reader_driver * sc_get_cardmod_driver(void) #endif #endif /* ENABLE_PCSC */ -