Hello community,

here is the log from the commit of package pcsc-lite for openSUSE:Factory 
checked in at 2016-06-02 12:39:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/pcsc-lite (Old)
 and      /work/SRC/openSUSE:Factory/.pcsc-lite.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "pcsc-lite"

Changes:
--------
--- /work/SRC/openSUSE:Factory/pcsc-lite/pcsc-lite.changes      2016-03-26 
15:20:49.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.pcsc-lite.new/pcsc-lite.changes 2016-06-02 
12:39:05.000000000 +0200
@@ -1,0 +2,9 @@
+Mon May 30 06:34:15 UTC 2016 - w...@rosenauer.org
+
+- Updated to version 1.8.17
+  * Fix SCardEndTransaction() issue with a SCARD_SHARE_EXCLUSIVE connection
+  * Fix an issue when used with systemd (problem in signal handler)
+  * SCardGetAttrib(): set pcbAttrLen when buffer is too small
+  * Some other minor improvements
+
+-------------------------------------------------------------------

Old:
----
  pcsc-lite-1.8.16.tar.bz2
  pcsc-lite-1.8.16.tar.bz2.asc

New:
----
  pcsc-lite-1.8.17.tar.bz2
  pcsc-lite-1.8.17.tar.bz2.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ pcsc-lite.spec ++++++
--- /var/tmp/diff_new_pack.OVD09S/_old  2016-06-02 12:39:06.000000000 +0200
+++ /var/tmp/diff_new_pack.OVD09S/_new  2016-06-02 12:39:06.000000000 +0200
@@ -21,7 +21,7 @@
 %define USER   scard
 %define GROUP  scard
 Name:           pcsc-lite
-Version:        1.8.16
+Version:        1.8.17
 Release:        0
 Summary:        PCSC Smart Cards Library
 License:        BSD-3-Clause

++++++ pcsc-lite-1.8.16.tar.bz2 -> pcsc-lite-1.8.17.tar.bz2 ++++++
++++ 2471 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/ChangeLog new/pcsc-lite-1.8.17/ChangeLog
--- old/pcsc-lite-1.8.16/ChangeLog      2016-03-20 16:52:25.000000000 +0100
+++ new/pcsc-lite-1.8.17/ChangeLog      2016-05-29 14:14:24.000000000 +0200
@@ -1,3 +1,14 @@
+1.8.17: Ludovic Rousseau
+29 May 2016
+- Fix SCardEndTransaction() issue with a SCARD_SHARE_EXCLUSIVE connection
+- Fix an issue when used with systemd (problem in signal handler)
+- SCardGetAttrib(): set pcbAttrLen when buffer is too small
+- Doxygen: SCardGetAttrib() pbAttr can be NULL
+- Doxygen: SCardGetAttrib() *pcbAttrLen contains the buffer size
+- fix compilation warnings and link errors on SunOS
+- Some other minor improvements
+
+
 1.8.16: Ludovic Rousseau
 20 March 2016
 - SCardCancel() was not correctly handled
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/ChangeLog.git new/pcsc-lite-1.8.17/ChangeLog.git
--- old/pcsc-lite-1.8.16/ChangeLog.git  2016-03-20 17:25:18.000000000 +0100
+++ new/pcsc-lite-1.8.17/ChangeLog.git  2016-05-29 14:15:18.000000000 +0200
@@ -1,4 +1,385 @@
-commit 55fa57fc691b732535fc3384a214b1daa133a127 (HEAD -> master, tag: 
pcsc-1.8.16, origin/master, origin/HEAD, github/master)
+commit f74dc1feea4c7a2345abb3e1861b350d46946c86 (HEAD -> master, tag: 
pcsc-1.8.17, origin/master, origin/HEAD)
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun May 29 14:11:21 2016 +0200
+
+    Release 1.8.17
+
+ ChangeLog    | 11 +++++++++++
+ configure.ac |  2 +-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+commit 0ba8145d814b846f2f2c2c59ad82e34f1253159a
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri May 27 18:57:19 2016 +0200
+
+    Doxygen: improve SCardGetStatusChange example
+    
+    Show how to wait for a card insertion.
+
+ src/winscard_clnt.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 687128ad9a377a27bd93e542fc096530534dc101
+Author: Richard PALO <rich...@netbsd.org>
+Date:   Sat Apr 23 18:13:37 2016 +0200
+
+    Fix SunOS compilation error
+    
+    Avoid visibility issues on SunOS on either gcc or studio
+    by using a guard stipulating minimum versions for each compiler
+    needed to support __attribute__((visibility("hidden")) or equivalent
+
+ src/misc.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 9be0451909b73a4f52e42c01915683954d7d0a84
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sat May 7 11:54:14 2016 +0200
+
+    Fix end of function comment
+
+ src/debuglog.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f3a6ccac63abd4d7d0e4eeced059128919286bab
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri May 20 17:07:03 2016 +0200
+
+    Unit Test for 74656f24
+    
+    SCardEndTransaction(): no card action in a transaction
+
+ UnitaryTests/SCardBeginTransaction_Reset.py | 85 +++++++++++++++++++++++++++++
+ 1 file changed, 85 insertions(+)
+
+commit 74656f24db3da1532040a1775ceffa225fbc3d00
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri May 20 17:02:40 2016 +0200
+
+    SCardEndTransaction(): no card action in a transaction
+    
+    If a transaction is ongoing then another SCardEndTransaction() should
+    not reset or unpower the card.
+    In that case SCARD_E_SHARING_VIOLATION is returned and the transaction
+    is not ended.
+
+ src/winscard.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit b7a4f8f47c1c57b56dfe6cd1088f68b845016d9b
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri May 20 16:19:56 2016 +0200
+
+    RFUnlockSharing: handle SCARD_SHARE_EXCLUSIVE
+    
+    When a card is connected using SCARD_SHARE_EXCLUSIVE then
+    RFUnlockSharing() called by SCardEndTransaction() should not be able to
+    remove the exclusive access.
+    
+    The bug was detected because the following sequence worked but should
+    not:
+    SCardConnect(..., SCARD_SHARE_EXCLUSIVE, ...);
+    SCardEndTransaction();
+    
+    An error was reported only on the second SCardEndTransaction() call.
+    
+    Now the first call to SCardEndTransaction() will fail and the card
+    connection will stay exclusive.
+    
+    Thanks to Christophe Ferrando for the bug report in "[Pcsclite-muscle]
+    SCARD_E_NOT_TRANSACTED"
+    
http://lists.alioth.debian.org/pipermail/pcsclite-muscle/Week-of-Mon-20160516/000598.html
+
+ src/readerfactory.c | 22 ++++++++++++++++------
+ 1 file changed, 16 insertions(+), 6 deletions(-)
+
+commit 88b2085b9c60c7a99aa1306187ad77ce1670a8eb
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri May 20 15:39:20 2016 +0200
+
+    SCardGetAttrib.py: display the values in ASCII
+    
+    Display the attributes values also in ASCII.
+    
+    The output is now something like:
+    PC/SC Readers: ['Gemalto PC Twin Reader (70D7E2EE) 00 00']
+    reader: Gemalto PC Twin Reader (70D7E2EE) 00 00
+    0x10103 [55, 48, 68, 55, 69, 50, 69, 69, 0] 37 30 44 37 45 32 45 45 00
+    70D7E2EE
+    0x90303 [59, 167, 0, 64, 24, 128, 101, 162, 8, 1, 1, 82] 3B A7 00 40 18
+    80 65 A2 08 01 01 52 ;�@�eR
+
+ UnitaryTests/SCardGetAttrib.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit b1effd21528d27dfa016c2752cf3e4cb973240f4
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Fri Apr 22 15:45:01 2016 +0200
+
+    pcscd.h.in: remove extra spaces
+
+ src/pcscd.h.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 77740786d5450273fad1400322918f5a276b3131
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Mon Apr 25 11:31:44 2016 +0200
+
+    SCardGetAttrib.py: also use SCARD_ATTR_ATR_STRING
+    
+    Try to use both attributes SCARD_ATTR_VENDOR_IFD_SERIAL_NO and
+    SCARD_ATTR_ATR_STRING
+    
+    Not all devices have a serial number so SCARD_ATTR_VENDOR_IFD_SERIAL_NO
+    may just return an empty buffer.
+    
+    SCARD_ATTR_ATR_STRING should always work when a card is inserted (and
+    the CCID driver is used).
+
+ UnitaryTests/SCardGetAttrib.py | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+commit fa52ae4e1f1ae3c35596e9aedaa3ce30fc5ceef9
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun Apr 24 19:04:04 2016 +0200
+
+    Fix use of d_type field on SunOS
+    
+    SunOS does not provide the d_type field in a directory entry.
+    
+    The code now checks that d_type is available using
+    AC_STRUCT_DIRENT_D_TYPE and use it conditionnaly.
+    
+    Fix compilation error on SunOS:
+    configfile.l: In function 'DBGetReaderListDir':
+    configfile.l:293:16: error: 'struct dirent' has no member named 'd_type'
+        if (direntry->d_type == DT_UNKNOWN)
+                    ^
+    configfile.l:293:28: error: 'DT_UNKNOWN' undeclared (first use in this 
function)
+        if (direntry->d_type == DT_UNKNOWN)
+                                ^
+    configfile.l:293:28: note: each undeclared identifier is reported only 
once for each function it appears in
+    configfile.l:312:17: error: 'struct dirent' has no member named 'd_type'
+         if (direntry->d_type != DT_REG)
+                     ^
+    configfile.l:312:29: error: 'DT_REG' undeclared (first use in this 
function)
+         if (direntry->d_type != DT_REG)
+                                 ^
+    
+    Thanks to risto3 for the bug report
+    https://github.com/LudovicRousseau/PCSC/issues/6
+
+ configure.ac     | 1 +
+ src/configfile.l | 4 ++++
+ 2 files changed, 5 insertions(+)
+
+commit 88acbfa03b98f28567c2438ea7aca6447488c0af
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun Apr 24 18:55:45 2016 +0200
+
+    Fix compiler warnings on SunOS
+    
+    utils.c: In function 'SendHotplugSignal':
+    utils.c:97:3: warning: format '%d' expects argument of type 'int', but 
argument 6 has type 'pid_t' [-Wformat=]
+       Log2(PCSC_LOG_INFO, "Send hotplug signal to pcscd (pid=%d)", pid);
+       ^
+    utils.c:100:4: warning: format '%d' expects argument of type 'int', but 
argument 6 has type 'pid_t' [-Wformat=]
+        Log3(PCSC_LOG_CRITICAL, "Can't signal pcscd (pid=%d): %s",
+        ^
+
+ src/utils.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 2360debebf1c35c8599cd2e0fc484e5f5029ab87
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun Apr 24 18:52:45 2016 +0200
+
+    Fix compiler warning on SunOS
+    
+    pcscdaemon.c: In function 'main':
+    pcscdaemon.c:402:5: warning: format '%d' expects argument of type 'int', 
but argument 6 has type 'pid_t' [-Wformat=]
+         Log2(PCSC_LOG_CRITICAL,
+         ^
+
+ src/pcscdaemon.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit abe436e38aa58cb1140eff0d497ba721474c7703
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun Apr 24 18:46:53 2016 +0200
+
+    Fix signal handler by using only allowed functions
+    
+    The signals are now treated in a special thread created just for that 
purpose.
+    
+    Thanks to Andre Florath for the bug report
+    
https://lists.alioth.debian.org/pipermail/pcsclite-muscle/Week-of-Mon-20160404/000561.html
+    
+    [Pcsclite-muscle] pcscd jams when using '--auto-exit'
+    
+    Andre Florath andre at florath.net
+    Sat Apr 9 06:06:44 UTC 2016
+    
+    Hello!
+    
+    Since some time I have problems with pcscd. I'm using pcscd in
+    conjunction with online banking and after a short period of working it
+    stops and jams the banking application.
+    
+    A 'strace' to the pcscd showed that it is still running somewhere
+    deep in the USB stack.
+    
+    The problem is, when manually running the the pcscd, there is no
+    problem at all - only when running from systemd.
+    Therefore I searched for the differences and found one: the
+    '--auto-exit'. Downloaded the source and had a closer look.
+    
+    What I understand from the source code is, that when '--auto-exit' is
+    given, a SIGALRM is generated which (should) terminate the process.
+    
+    I have noticed that the signal handler 'signal_trap()' uses some
+    function calls that are not allowed in signal handlers; like:
+    * syslog()
+    * gettimeofday()
+    * remove()
+    
+    Using this creates undefined behavior.
+    (Please see 'man 7 signal' for a complete list of system calls that
+    are not allowed in signal handlers.)
+    
+    I found a workaround for the issue.
+    Changed the service file to:
+    
+    ===
+    [Unit]
+    Description=PC/SC Smart Card Daemon
+    
+    [Service]
+    ExecStart=/usr/sbin/pcscd --foreground --debug -a
+    ExecReload=/usr/sbin/pcscd --hotplug
+    
+    [Install]
+    Also=pcscd.socket
+    ===
+    
+    and disabling the pcscd.socket gives me a stable system.
+    (Yes - pcscd is now started at boot time and runs the whole time
+     - which is fine for me.)
+    
+    If you need more information, please drop me a note.
+    
+    Kind regards
+    
+    Andre
+
+ src/pcscdaemon.c | 170 ++++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 111 insertions(+), 59 deletions(-)
+
+commit b48ff146f979cd3323845e1c19d1c1629d2ae037
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sun Apr 24 18:25:03 2016 +0200
+
+    Check alloca(3) is available
+    
+    The code uses alloca(3) so we check in ./configure that this function is
+    available.
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 890f7edbd931467fd381739257ac1e1f335eb64a
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Sat Apr 23 15:57:46 2016 +0200
+
+    readerfactory: fix compilation warning on SunOS
+    
+    The code uses alloca() so we #include "alloca.h"
+    
+    readerfactory.c: In function 'RFAddReader':
+    readerfactory.c:211:2: warning: implicit declaration of function 'alloca' 
[-Wimplicit-function-declaration]
+      readerName = alloca(strlen(readerNameLong)+1);
+      ^
+    readerfactory.c:211:15: warning: incompatible implicit declaration of 
built-in function 'alloca'
+      readerName = alloca(strlen(readerNameLong)+1);
+                   ^
+
+ src/readerfactory.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2269f10c2d2c5be1308d59469722024650a19b6d
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Wed Apr 13 18:29:53 2016 +0200
+
+    SCardConnect(): fix a Valgrind warning
+    
+    ==19635== Memcheck, a memory error detector
+    ==19635== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
+    ==19635== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
+    ==19635== Command: /usr/rtests/bin/Pkcs11UnitTest.X64 pkcs11_common
+    ==19635==
+    Running pkcs11_common
+    pkcs11_common::testGetInfo==19635== Syscall param socketcall.sendto(msg) 
points to uninitialised byte(s)
+    ==19635== at 0x605A1F7: send (send.c:32)
+    ==19635== by 0xBC47CE6: ??? (in /lib/x86_64-linux-gnu/libpcsclite.so.1.0.0)
+    ==19635== by 0xBC47E22: ??? (in /lib/x86_64-linux-gnu/libpcsclite.so.1.0.0)
+    ==19635== by 0xBC43BBE: SCardConnect (in 
/lib/x86_64-linux-gnu/libpcsclite.so.1.0.0)
+    ...
+    
+    The field scConnectStruct.szReader (containing the reader name) was not
+    completely initialized.
+    
+    Thanks to Andrey Roussev for the patch
+    
https://lists.alioth.debian.org/pipermail/pcsclite-muscle/Week-of-Mon-20160404/000560.html
+
+ src/winscard_clnt.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d6c7215335fe04abfd91206349c7d674de7bfcaa
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Thu Mar 31 16:43:16 2016 +0200
+
+    Doxygen: SCardGetAttrib() *pcbAttrLen contains the buffer size
+    
+    On return *pcbAttrLen contains the actual length of the received
+    attribute.
+    
+    If the buffer was not big enough the error SCARD_E_INSUFFICIENT_BUFFER
+    is returned and *pcbAttrLen contains the expected size.
+
+ src/winscard_clnt.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e64629f80a4639836399493ef5c3c717571ffc96
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Thu Mar 31 16:11:44 2016 +0200
+
+    SCardGetAttrib(): set pcbAttrLen when buffer is too small
+    
+    When the user provides a pbAttr[] buffer too small then the error code
+    SCARD_E_INSUFFICIENT_BUFFER is returned and the correct buffer size
+    value is set in pcbAttrLen.
+    
+    Before the change the value of pcbAttrLen was not changed so the user
+    had no idea what the correct value should be.
+
+ src/winscard_clnt.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit 84a9441d52e72e1fbec6aa2b0dd6db27d3f5ce38
+Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
+Date:   Thu Mar 31 11:42:39 2016 +0200
+
+    Doxygen: SCardGetAttrib() pbAttr can be NULL
+    
+    If pbAttr is NULL then the correct buffer size is indicated in
+    pcbAttrLen.
+    
+    Also modify the example to use the double call.
+
+ src/winscard_clnt.c | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 55fa57fc691b732535fc3384a214b1daa133a127 (tag: pcsc-1.8.16, 
github/master)
 Author: Ludovic Rousseau <ludovic.rouss...@free.fr>
 Date:   Sun Mar 20 16:57:30 2016 +0100
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/config.h.in new/pcsc-lite-1.8.17/config.h.in
--- old/pcsc-lite-1.8.16/config.h.in    2016-03-20 16:19:57.000000000 +0100
+++ new/pcsc-lite-1.8.17/config.h.in    2016-05-29 14:14:55.000000000 +0200
@@ -6,12 +6,31 @@
 /* display ATR parsing debug messages. */
 #undef ATR_DEBUG
 
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
 /* Filter reader names */
 #undef FILTER_NAMES
 
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
 /* Define to 1 if you have the `daemon' function. */
 #undef HAVE_DAEMON
 
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
@@ -54,6 +73,9 @@
 /* Define to 1 if you have the `nanosleep' function. */
 #undef HAVE_NANOSLEEP
 
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
 /* Build polkit access control support */
 #undef HAVE_POLKIT
 
@@ -85,12 +107,23 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if `d_type' is a member of `struct dirent'. */
+#undef HAVE_STRUCT_DIRENT_D_TYPE
+
 /* Define to 1 if you have the <syslog.h> header file. */
 #undef HAVE_SYSLOG_H
 
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
 /* Define to 1 if you have the <sys/filio.h> header file. */
 #undef HAVE_SYS_FILIO_H
 
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
@@ -156,6 +189,14 @@
    your system. */
 #undef PTHREAD_CREATE_JOINABLE
 
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+       STACK_DIRECTION > 0 => grows toward higher addresses
+       STACK_DIRECTION < 0 => grows toward lower addresses
+       STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/configure.ac new/pcsc-lite-1.8.17/configure.ac
--- old/pcsc-lite-1.8.16/configure.ac   2016-03-20 16:52:25.000000000 +0100
+++ new/pcsc-lite-1.8.17/configure.ac   2016-05-29 14:14:24.000000000 +0200
@@ -3,7 +3,7 @@
 
 AC_PREREQ([2.69])
 
-AC_INIT([pcsc-lite],[1.8.16])
+AC_INIT([pcsc-lite],[1.8.17])
 AC_CONFIG_SRCDIR(src/pcscdaemon.c)
 AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
 AC_CONFIG_HEADERS([config.h])
@@ -101,12 +101,14 @@
 AC_TYPE_UID_T
 AC_TYPE_SIZE_T
 AC_HEADER_TIME
+AC_STRUCT_DIRENT_D_TYPE
 
 # Checks for library functions
 AC_FUNC_ERROR_AT_LINE
 AC_FUNC_STAT
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS(daemon flock getopt_long nanosleep strerror vsnprintf)
+AC_FUNC_ALLOCA
 
 # C Compiler features
 AC_C_INLINE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/PCSC/pcsclite.h 
new/pcsc-lite-1.8.17/src/PCSC/pcsclite.h
--- old/pcsc-lite-1.8.16/src/PCSC/pcsclite.h    2016-03-20 16:41:26.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/PCSC/pcsclite.h    2016-05-29 14:15:09.000000000 
+0200
@@ -279,7 +279,7 @@
 #define INFINITE                       0xFFFFFFFF      /**< Infinite timeout */
 #endif
 
-#define PCSCLITE_VERSION_NUMBER                "1.8.16"        /**< Current 
version */
+#define PCSCLITE_VERSION_NUMBER                "1.8.17"        /**< Current 
version */
 /** Maximum readers context (a slot is count as a reader) */
 #define PCSCLITE_MAX_READERS_CONTEXTS                  16
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/configfile.c new/pcsc-lite-1.8.17/src/configfile.c
--- old/pcsc-lite-1.8.16/src/configfile.c       2015-11-18 16:50:24.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/configfile.c       2016-05-29 14:16:07.000000000 
+0200
@@ -7,8 +7,8 @@
 
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 0
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -210,7 +210,7 @@
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
         */
-       yy_size_t yy_n_chars;
+       int yy_n_chars;
 
        /* Whether we "own" the buffer - i.e., we know we created it,
         * and can realloc() it to grow it, and should free() it to
@@ -280,7 +280,7 @@
 
 /* yy_hold_char holds the character lost when yytext is formed. */
 static char yy_hold_char;
-static yy_size_t yy_n_chars;           /* number of characters read into 
yy_ch_buf */
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
 yy_size_t yyleng;
 
 /* Points to current character in buffer. */
@@ -341,7 +341,7 @@
 
 /* Begin user sect3 */
 
-#define yywrap() 1
+#define yywrap() (/*CONSTCOND*/1)
 #define YY_SKIP_YYWRAP
 
 typedef unsigned char YY_CHAR;
@@ -355,11 +355,17 @@
 int yylineno = 1;
 
 extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
 #define yytext_ptr yytext
 
 static yy_state_type yy_get_previous_state (void );
 static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
 static int yy_get_next_buffer (void );
+#if defined(__GNUC__) && __GNUC__ >= 3
+__attribute__((__noreturn__))
+#endif
 static void yy_fatal_error (yyconst char msg[]  );
 
 /* Done after the current pattern has been matched and before the
@@ -387,7 +393,7 @@
         0,    3,    1,    0,    5,    0
     } ;
 
-static yyconst flex_int32_t yy_ec[256] =
+static yyconst YY_CHAR yy_ec[256] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -419,12 +425,12 @@
         1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int32_t yy_meta[11] =
+static yyconst YY_CHAR yy_meta[11] =
     {   0,
         1,    1,    2,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[20] =
+static yyconst flex_uint16_t yy_base[20] =
     {   0,
         0,    0,   15,   31,   31,   31,    8,    0,   10,   10,
        18,   31,    0,   20,    0,   31,   26,   13,   28
@@ -436,7 +442,7 @@
        17,   16,   18,   19,   10,    0,   16,   16,   16
     } ;
 
-static yyconst flex_int16_t yy_nxt[42] =
+static yyconst flex_uint16_t yy_nxt[42] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   10,   10,   10,
        12,   12,   12,   13,   16,   12,   15,   15,   15,   15,
@@ -531,7 +537,7 @@
 void tok_error(char *pcToken_error);
 
 #define YY_NO_INPUT 1
-#line 535 "configfile.c"
+#line 541 "configfile.c"
 
 #define INITIAL 0
 
@@ -564,11 +570,11 @@
 
 FILE *yyget_in (void );
 
-void yyset_in  (FILE * in_str  );
+void yyset_in  (FILE * _in_str  );
 
 FILE *yyget_out (void );
 
-void yyset_out  (FILE * out_str  );
+void yyset_out  (FILE * _out_str  );
 
 yy_size_t yyget_leng (void );
 
@@ -576,7 +582,7 @@
 
 int yyget_lineno (void );
 
-void yyset_lineno (int line_number  );
+void yyset_lineno (int _line_number  );
 
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -590,6 +596,10 @@
 #endif
 #endif
 
+#ifndef YY_NO_UNPUT
+    
+#endif
+
 #ifndef yytext_ptr
 static void yy_flex_strncpy (char *,yyconst char *,int );
 #endif
@@ -702,7 +712,7 @@
 
 /* Code executed at the end of each rule. */
 #ifndef YY_BREAK
-#define YY_BREAK break;
+#define YY_BREAK /*LINTED*/break;
 #endif
 
 #define YY_RULE_SETUP \
@@ -712,9 +722,9 @@
  */
 YY_DECL
 {
-       register yy_state_type yy_current_state;
-       register char *yy_cp, *yy_bp;
-       register int yy_act;
+       yy_state_type yy_current_state;
+       char *yy_cp, *yy_bp;
+       int yy_act;
     
        if ( !(yy_init) )
                {
@@ -746,9 +756,9 @@
 #line 69 "configfile.l"
 
 
-#line 750 "configfile.c"
+#line 760 "configfile.c"
 
-       while ( 1 )             /* loops until end-of-file is reached */
+       while ( /*CONSTCOND*/1 )                /* loops until end-of-file is 
reached */
                {
                yy_cp = (yy_c_buf_p);
 
@@ -764,7 +774,7 @@
 yy_match:
                do
                        {
-                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+                       YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
                        if ( yy_accept[yy_current_state] )
                                {
                                (yy_last_accepting_state) = yy_current_state;
@@ -840,7 +850,7 @@
 #line 77 "configfile.l"
 ECHO;
        YY_BREAK
-#line 844 "configfile.c"
+#line 854 "configfile.c"
 case YY_STATE_EOF(INITIAL):
        yyterminate();
 
@@ -983,9 +993,9 @@
  */
 static int yy_get_next_buffer (void)
 {
-       register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-       register char *source = (yytext_ptr);
-       register int number_to_move, i;
+       char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+       char *source = (yytext_ptr);
+       yy_size_t number_to_move, i;
        int ret_val;
 
        if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 
1] )
@@ -1014,7 +1024,7 @@
        /* Try to read more data. */
 
        /* First move last chars to start of buffer. */
-       number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+       number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1;
 
        for ( i = 0; i < number_to_move; ++i )
                *(dest++) = *(source++);
@@ -1096,9 +1106,9 @@
        else
                ret_val = EOB_ACT_CONTINUE_SCAN;
 
-       if ((yy_size_t) ((yy_n_chars) + number_to_move) > 
YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+       if ((int) ((yy_n_chars) + number_to_move) > 
YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
                /* Extend the array by 50%, plus the number we really need. */
-               yy_size_t new_size = (yy_n_chars) + number_to_move + 
((yy_n_chars) >> 1);
+               int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 
1);
                YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void 
*) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
                if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
                        YY_FATAL_ERROR( "out of dynamic memory in 
yy_get_next_buffer()" );
@@ -1117,14 +1127,14 @@
 
     static yy_state_type yy_get_previous_state (void)
 {
-       register yy_state_type yy_current_state;
-       register char *yy_cp;
+       yy_state_type yy_current_state;
+       char *yy_cp;
     
        yy_current_state = (yy_start);
 
        for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp 
)
                {
-               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 
1);
+               YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
                if ( yy_accept[yy_current_state] )
                        {
                        (yy_last_accepting_state) = yy_current_state;
@@ -1149,10 +1159,10 @@
  */
     static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
 {
-       register int yy_is_jam;
-       register char *yy_cp = (yy_c_buf_p);
+       int yy_is_jam;
+       char *yy_cp = (yy_c_buf_p);
 
-       register YY_CHAR yy_c = 1;
+       YY_CHAR yy_c = 1;
        if ( yy_accept[yy_current_state] )
                {
                (yy_last_accepting_state) = yy_current_state;
@@ -1170,6 +1180,10 @@
                return yy_is_jam ? 0 : yy_current_state;
 }
 
+#ifndef YY_NO_UNPUT
+
+#endif
+
 #ifndef YY_NO_INPUT
 #ifdef __cplusplus
     static int yyinput (void)
@@ -1319,7 +1333,7 @@
        if ( ! b )
                YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
-       b->yy_buf_size = size;
+       b->yy_buf_size = (yy_size_t)size;
 
        /* yy_ch_buf has to be 2 characters longer than the size given because
         * we need to put in 2 end-of-buffer characters.
@@ -1474,7 +1488,7 @@
                 * scanner will even need a stack. We use 2 instead of 1 to 
avoid an
                 * immediate realloc on the next call.
          */
-               num_to_alloc = 1;
+               num_to_alloc = 1; /* After all that talk, this was set to 1 
anyways... */
                (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
                                                                (num_to_alloc * 
sizeof(struct yy_buffer_state*)
                                                                );
@@ -1491,7 +1505,7 @@
        if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
 
                /* Increase the buffer to prepare for a possible push. */
-               int grow_size = 8 /* arbitrary grow size */;
+               yy_size_t grow_size = 8 /* arbitrary grow size */;
 
                num_to_alloc = (yy_buffer_stack_max) + grow_size;
                (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
@@ -1599,7 +1613,7 @@
 
 static void yy_fatal_error (yyconst char* msg )
 {
-       (void) fprintf( stderr, "%s\n", msg );
+                       (void) fprintf( stderr, "%s\n", msg );
        exit( YY_EXIT_FAILURE );
 }
 
@@ -1665,29 +1679,29 @@
 }
 
 /** Set the current line number.
- * @param line_number
+ * @param _line_number line number
  * 
  */
-void yyset_lineno (int  line_number )
+void yyset_lineno (int  _line_number )
 {
     
-    yylineno = line_number;
+    yylineno = _line_number;
 }
 
 /** Set the input stream. This does not discard the current
  * input buffer.
- * @param in_str A readable stream.
+ * @param _in_str A readable stream.
  * 
  * @see yy_switch_to_buffer
  */
-void yyset_in (FILE *  in_str )
+void yyset_in (FILE *  _in_str )
 {
-        yyin = in_str ;
+        yyin = _in_str ;
 }
 
-void yyset_out (FILE *  out_str )
+void yyset_out (FILE *  _out_str )
 {
-        yyout = out_str ;
+        yyout = _out_str ;
 }
 
 int yyget_debug  (void)
@@ -1695,9 +1709,9 @@
         return yy_flex_debug;
 }
 
-void yyset_debug (int  bdebug )
+void yyset_debug (int  _bdebug )
 {
-        yy_flex_debug = bdebug ;
+        yy_flex_debug = _bdebug ;
 }
 
 static int yy_init_globals (void)
@@ -1757,7 +1771,8 @@
 #ifndef yytext_ptr
 static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
 {
-       register int i;
+               
+       int i;
        for ( i = 0; i < n; ++i )
                s1[i] = s2[i];
 }
@@ -1766,7 +1781,7 @@
 #ifdef YY_NEED_STRLEN
 static int yy_flex_strlen (yyconst char * s )
 {
-       register int n;
+       int n;
        for ( n = 0; s[n]; ++n )
                ;
 
@@ -1776,11 +1791,12 @@
 
 void *yyalloc (yy_size_t  size )
 {
-       return (void *) malloc( size );
+                       return (void *) malloc( size );
 }
 
 void *yyrealloc  (void * ptr, yy_size_t  size )
 {
+               
        /* The cast to (char *) in the following accommodates both
         * implementations that use char* generic pointers, and those
         * that use void* generic pointers.  It works with the latter
@@ -1793,12 +1809,12 @@
 
 void yyfree (void * ptr )
 {
-       free( (char *) ptr );   /* see yyrealloc() for (char *) cast */
+                       free( (char *) ptr );   /* see yyrealloc() for (char *) 
cast */
 }
 
 #define YYTABLES_NAME "yytables"
 
-#line 76 "configfile.l"
+#line 77 "configfile.l"
 
 
 
@@ -2016,7 +2032,9 @@
                                readerconf_dir, direntry->d_name);
 
                        /* skip non regular files */
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
                        if (direntry->d_type == DT_UNKNOWN)
+#endif
                        {
                                struct stat st;
 
@@ -2035,7 +2053,9 @@
                                }
                        }
                        else
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
                                if (direntry->d_type != DT_REG)
+#endif
                                {
                                        Log2(PCSC_LOG_DEBUG, "Skipping non 
regular file: %s",
                                                direntry->d_name);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/configfile.l new/pcsc-lite-1.8.17/src/configfile.l
--- old/pcsc-lite-1.8.16/src/configfile.l       2015-11-06 09:39:51.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/configfile.l       2016-05-06 13:16:10.000000000 
+0200
@@ -290,7 +290,9 @@
                                readerconf_dir, direntry->d_name);
 
                        /* skip non regular files */
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
                        if (direntry->d_type == DT_UNKNOWN)
+#endif
                        {
                                struct stat st;
 
@@ -309,7 +311,9 @@
                                }
                        }
                        else
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
                                if (direntry->d_type != DT_REG)
+#endif
                                {
                                        Log2(PCSC_LOG_DEBUG, "Skipping non 
regular file: %s",
                                                direntry->d_name);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/debuglog.c new/pcsc-lite-1.8.17/src/debuglog.c
--- old/pcsc-lite-1.8.16/src/debuglog.c 2015-11-06 09:39:51.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/debuglog.c 2016-05-20 19:44:43.000000000 +0200
@@ -192,7 +192,7 @@
                }
                fflush(stdout);
        }
-} /* log_msg */
+} /* log_line */
 
 static void log_xxd_always(const int priority, const char *msg,
        const unsigned char *buffer, const int len)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/misc.h new/pcsc-lite-1.8.17/src/misc.h
--- old/pcsc-lite-1.8.16/src/misc.h     2015-11-06 09:39:51.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/misc.h     2016-05-29 14:14:24.000000000 +0200
@@ -40,10 +40,12 @@
  * see 
http://gcc.gnu.org/onlinedocs/gcc-3.3.5/gcc/Function-Attributes.html#Function-Attributes
  * see http://www.nedprod.com/programs/gccvisibility.html
  */
-#if defined __GNUC__ && (! defined (__sun)) && (__GNUC__ >= 4 || (__GNUC__ == 
3 && __GNUC_MINOR__ >= 3))
+#if defined(__GNUC__) && \
+       (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) || \
+       defined(__SUNPRO_C) && __SUNPRO_C >= 0x590
 #define INTERNAL __attribute__ ((visibility("hidden")))
 #define PCSC_API __attribute__ ((visibility("default")))
-#elif (! defined __GNUC__ ) && defined (__sun)
+#elif defined(__SUNPRO_C) && __SUNPRO_C >= 0x550
 /* 
http://wikis.sun.com/display/SunStudio/Macros+for+Shared+Library+Symbol+Visibility
 */
 #define INTERNAL __hidden
 #define PCSC_API __global
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/pcscd.h new/pcsc-lite-1.8.17/src/pcscd.h
--- old/pcsc-lite-1.8.16/src/pcscd.h    2016-03-20 16:41:26.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/pcscd.h    2016-05-29 14:15:09.000000000 +0200
@@ -7,7 +7,7 @@
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
@@ -15,7 +15,7 @@
  *    documentation and/or other materials provided with the distribution.
  * 3. The name of the author may not be used to endorse or promote products
  *    derived from this software without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -49,7 +49,7 @@
 
 #define PCSCLITE_CSOCK_NAME            PCSCLITE_IPC_DIR "/pcscd.comm"
 
-#define PCSCLITE_VERSION_NUMBER                "1.8.16"        /**< Current 
version */
+#define PCSCLITE_VERSION_NUMBER                "1.8.17"        /**< Current 
version */
 #define PCSCLITE_STATUS_POLL_RATE      400000          /**< Status polling 
rate */
 #define PCSCLITE_LOCK_POLL_RATE                100000          /**< Lock 
polling rate */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/pcscd.h.in new/pcsc-lite-1.8.17/src/pcscd.h.in
--- old/pcsc-lite-1.8.16/src/pcscd.h.in 2016-03-12 20:03:09.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/pcscd.h.in 2016-05-20 19:44:43.000000000 +0200
@@ -7,7 +7,7 @@
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
@@ -15,7 +15,7 @@
  *    documentation and/or other materials provided with the distribution.
  * 3. The name of the author may not be used to endorse or promote products
  *    derived from this software without specific prior written permission.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/pcscdaemon.c new/pcsc-lite-1.8.17/src/pcscdaemon.c
--- old/pcsc-lite-1.8.16/src/pcscdaemon.c       2016-03-12 20:03:09.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/pcscdaemon.c       2016-05-06 13:16:10.000000000 
+0200
@@ -81,6 +81,7 @@
 static int ExitValue = EXIT_FAILURE;
 int HPForceReaderPolling = 0;
 static int pipefd[] = {-1, -1};
+static int signal_handler_fd[] = {-1, -1};
 char Add_Serial_In_Name = TRUE;
 char Add_Interface_In_Name = TRUE;
 
@@ -89,7 +90,6 @@
  */
 static void at_exit(void);
 static void clean_temp_files(void);
-static void signal_reload(int sig);
 static void signal_trap(int);
 static void print_version (void);
 static void print_usage (char const * const);
@@ -152,6 +152,10 @@
                        /* Nothing to do in case of a syscall interrupted
                         * It happens when SIGUSR1 (reload) or SIGINT (Ctrl-C) 
is received
                         * We just try again */
+
+                       /* we wait a bit so that the signal handler thread can 
do
+                        * its job and set AraKiri if needed */
+                       SYS_USleep(1000);
                        break;
 
                default:
@@ -162,6 +166,93 @@
        }
 }
 
+/**
+ * thread dedicated to handle signals
+ *
+ * a signal handler can not call any function. See signal(7) for a list
+ * of function that are safe to call from a signal handler.
+ * The functions syslog(), gettimeofday() and remove() are NOT safe.
+ */
+static void *signal_thread(void *arg)
+{
+       (void)arg;
+
+       while (TRUE)
+       {
+               int r;
+               int sig;
+
+               r = read(signal_handler_fd[0], &sig, sizeof sig);
+               if (r < 0)
+               {
+                       Log2(PCSC_LOG_ERROR, "read failed: %s", 
strerror(errno));
+                       return NULL;
+               }
+
+               Log2(PCSC_LOG_INFO, "Received signal: %d", sig);
+
+               /* signal for hotplug */
+               if (SIGUSR1 == sig)
+               {
+#ifdef USE_USB
+                       if (! AraKiri)
+                               HPReCheckSerialReaders();
+#endif
+                       /* Reenable the signal handler.
+                        * This is needed on Solaris and HPUX. */
+                       (void)signal(SIGUSR1, signal_trap);
+
+                       continue;
+               }
+
+               /* do not wait if asked to terminate
+                * avoids waiting after the reader(s) in shutdown for example */
+               if (SIGTERM == sig)
+               {
+                       Log1(PCSC_LOG_INFO, "Direct suicide");
+                       at_exit();
+               }
+
+               if (SIGALRM == sig)
+               {
+                       /* normal exit without error */
+                       ExitValue = EXIT_SUCCESS;
+               }
+
+               /* the signal handler is called several times for the same 
Ctrl-C */
+               if (AraKiri == FALSE)
+               {
+                       Log1(PCSC_LOG_INFO, "Preparing for suicide");
+                       AraKiri = TRUE;
+
+                       /* if still in the init/loading phase the AraKiri will 
not be
+                        * seen by the main event loop
+                        */
+                       if (Init)
+                       {
+                               Log1(PCSC_LOG_INFO, "Suicide during init");
+                               at_exit();
+                       }
+               }
+               else
+               {
+                       /* if pcscd do not want to die */
+                       static int lives = 2;
+
+                       lives--;
+                       /* no live left. Something is blocking the normal 
death. */
+                       if (0 == lives)
+                       {
+                               Log1(PCSC_LOG_INFO, "Forced suicide");
+                               at_exit();
+                       }
+               }
+       }
+
+       return NULL;
+}
+
+
 int main(int argc, char **argv)
 {
        int rv;
@@ -400,7 +491,7 @@
                                Log1(PCSC_LOG_CRITICAL,
                                        "file " PCSCLITE_CSOCK_NAME " already 
exists.");
                                Log2(PCSC_LOG_CRITICAL,
-                                       "Another pcscd (pid: %d) seems to be 
running.", pid);
+                                       "Another pcscd (pid: %ld) seems to be 
running.", (long)pid);
                                return EXIT_FAILURE;
                        }
                        else
@@ -515,6 +606,20 @@
        /* exits on SIGALARM to allow pcscd to suicide if not used */
        (void)signal(SIGALRM, signal_trap);
 
+       if (pipe(signal_handler_fd) == -1)
+       {
+               Log2(PCSC_LOG_CRITICAL, "pipe() failed: %s", strerror(errno));
+               return EXIT_FAILURE;
+       }
+
+       pthread_t signal_handler_thread;
+       rv = pthread_create(&signal_handler_thread, NULL, signal_thread, NULL);
+       if (rv)
+       {
+               Log2(PCSC_LOG_CRITICAL, "pthread_create failed: %s", 
strerror(rv));
+               return EXIT_FAILURE;
+       }
+
        /*
         * If PCSCLITE_IPC_DIR does not exist then create it
         */
@@ -610,7 +715,7 @@
        /*
         * Hotplug rescan
         */
-       (void)signal(SIGUSR1, signal_reload);
+       (void)signal(SIGUSR1, signal_trap);
 
        /*
         * Initialize the comm structure
@@ -730,66 +835,13 @@
                        strerror(errno));
 }
 
-static void signal_reload(/*@unused@*/ int sig)
-{
-       (void)signal(SIGUSR1, signal_reload);
-
-       (void)sig;
-
-       if (AraKiri)
-               return;
-
-#ifdef USE_USB
-       HPReCheckSerialReaders();
-#endif
-} /* signal_reload */
-
 static void signal_trap(int sig)
 {
-       Log2(PCSC_LOG_INFO, "Received signal: %d", sig);
-
-       /* do not wait if asked to terminate
-        * avoids waiting after the reader(s) in shutdown for example */
-       if (SIGTERM == sig)
-       {
-               Log1(PCSC_LOG_INFO, "Direct suicide");
-               at_exit();
-       }
-
-       if (SIGALRM == sig)
-       {
-               /* normal exit without error */
-               ExitValue = EXIT_SUCCESS;
-       }
-
-       /* the signal handler is called several times for the same Ctrl-C */
-       if (AraKiri == FALSE)
-       {
-               Log1(PCSC_LOG_INFO, "Preparing for suicide");
-               AraKiri = TRUE;
-
-               /* if still in the init/loading phase the AraKiri will not be
-                * seen by the main event loop
-                */
-               if (Init)
-               {
-                       Log1(PCSC_LOG_INFO, "Suicide during init");
-                       at_exit();
-               }
-       }
-       else
-       {
-               /* if pcscd do not want to die */
-               static int lives = 2;
+       int r;
 
-               lives--;
-               /* no live left. Something is blocking the normal death. */
-               if (0 == lives)
-               {
-                       Log1(PCSC_LOG_INFO, "Forced suicide");
-                       at_exit();
-               }
-       }
+       r = write(signal_handler_fd[1], &sig, sizeof sig);
+       if (r < 0)
+               Log2(PCSC_LOG_ERROR, "write failed: %s", strerror(errno));
 }
 
 static void print_version (void)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/readerfactory.c 
new/pcsc-lite-1.8.17/src/readerfactory.c
--- old/pcsc-lite-1.8.16/src/readerfactory.c    2015-12-25 20:55:51.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/readerfactory.c    2016-05-20 19:44:43.000000000 
+0200
@@ -49,6 +49,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
+#include "alloca.h"
 
 #include "misc.h"
 #include "pcscd.h"
@@ -1026,15 +1027,25 @@
        rv = RFCheckSharing(hCard, rContext);
        if (SCARD_S_SUCCESS == rv)
        {
-               if (rContext->LockCount > 0)
+               if (PCSCLITE_SHARING_EXCLUSIVE_CONTEXT == rContext->contexts)
                {
-                       rContext->LockCount -= 1;
-                       if (0 == rContext->LockCount)
-                               rContext->hLockId = 0;
+                       if (rContext->LockCount > 1)
+                               rContext->LockCount -= 1;
+                       else
+                               rv = SCARD_E_NOT_TRANSACTED;
                }
                else
-                       /* rContext->LockCount == 0 */
-                       rv = SCARD_E_NOT_TRANSACTED;
+               {
+                       if (rContext->LockCount > 0)
+                       {
+                               rContext->LockCount -= 1;
+                               if (0 == rContext->LockCount)
+                                       rContext->hLockId = 0;
+                       }
+                       else
+                               /* rContext->LockCount == 0 */
+                               rv = SCARD_E_NOT_TRANSACTED;
+               }
        }
        (void)pthread_mutex_unlock(&LockMutex);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/utils.c new/pcsc-lite-1.8.17/src/utils.c
--- old/pcsc-lite-1.8.16/src/utils.c    2015-11-06 09:39:51.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/utils.c    2016-05-06 13:16:10.000000000 +0200
@@ -94,11 +94,12 @@
 
        if (pid != -1)
        {
-               Log2(PCSC_LOG_INFO, "Send hotplug signal to pcscd (pid=%d)", 
pid);
+               Log2(PCSC_LOG_INFO, "Send hotplug signal to pcscd (pid=%ld)",
+                       (long)pid);
                if (kill(pid, SIGUSR1) < 0)
                {
-                       Log3(PCSC_LOG_CRITICAL, "Can't signal pcscd (pid=%d): 
%s",
-                               pid, strerror(errno));
+                       Log3(PCSC_LOG_CRITICAL, "Can't signal pcscd (pid=%ld): 
%s",
+                               (long)pid, strerror(errno));
                        return EXIT_FAILURE ;
                }
                (void)SYS_Sleep(1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/winscard.c new/pcsc-lite-1.8.17/src/winscard.c
--- old/pcsc-lite-1.8.16/src/winscard.c 2016-03-12 20:03:09.000000000 +0100
+++ new/pcsc-lite-1.8.17/src/winscard.c 2016-05-20 19:44:43.000000000 +0200
@@ -1137,6 +1137,18 @@
        if (rv != SCARD_S_SUCCESS)
                goto exit;
 
+       /*
+        * Error if another transaction is ongoing and a card action is
+        * requested
+        */
+       if ((dwDisposition != SCARD_LEAVE_CARD) && (rContext->hLockId != 0)
+               && (rContext->hLockId != hCard))
+       {
+               Log1(PCSC_LOG_INFO, "No card reset within a transaction");
+               rv = SCARD_E_SHARING_VIOLATION;
+               goto exit;
+       }
+
        if (dwDisposition == SCARD_RESET_CARD ||
                dwDisposition == SCARD_UNPOWER_CARD)
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/pcsc-lite-1.8.16/src/winscard_clnt.c 
new/pcsc-lite-1.8.17/src/winscard_clnt.c
--- old/pcsc-lite-1.8.16/src/winscard_clnt.c    2016-03-12 20:03:09.000000000 
+0100
+++ new/pcsc-lite-1.8.17/src/winscard_clnt.c    2016-05-29 14:14:24.000000000 
+0200
@@ -794,6 +794,7 @@
        if (NULL == currentContextMap)
                return SCARD_E_INVALID_HANDLE;
 
+       memset(scConnectStruct.szReader, 0, sizeof scConnectStruct.szReader);
        strncpy(scConnectStruct.szReader, szReader, sizeof 
scConnectStruct.szReader);
        scConnectStruct.szReader[sizeof scConnectStruct.szReader -1] = '\0';
 
@@ -1623,9 +1624,17 @@
  * rgReaderStates[1].szReader = "\\\\?PnP?\\Notification";
  * rgReaderStates[1].dwCurrentState = SCARD_STATE_UNAWARE;
  * ...
+ * // Get current state
  * rv = SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 2);
  * printf("reader state: 0x%04X\n", rgReaderStates[0].dwEventState);
  * printf("reader state: 0x%04X\n", rgReaderStates[1].dwEventState);
+ *
+ * // Wait for card insertion
+ * if (rgReaderStates[0].dwEventState & SCARD_STATE_EMPTY)
+ * {
+ *     rgReaderStates[0].dwCurrentState = rgReaderStates[0].dwEventState;
+ *     rv = SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 2);
+ * }
  * @endcode
  */
 LONG SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,
@@ -2319,14 +2328,18 @@
  * - \ref SCARD_ATTR_VENDOR_IFD_VERSION
  * - \ref SCARD_ATTR_VENDOR_NAME
  * @param[out] pbAttr Pointer to a buffer that receives the attribute.
- * @param[in,out] pcbAttrLen Length of the \p pbAttr buffer in bytes.
+ * If this value is NULL, SCardGetAttrib() ignores the buffer length
+ * supplied in \p pcbAttrLen, writes the length of the buffer that would
+ * have been returned if this parameter had not been NULL to \p pcbAttrLen,
+ * and returns a success code.
+ * @param[in,out] pcbAttrLen Length of the \p pbAttr buffer in bytes and 
receives the actual length of the received attribute.
  *
  * @return Error code.
  * @retval SCARD_S_SUCCESS Successful (\ref SCARD_S_SUCCESS)
  * @retval SCARD_E_UNSUPPORTED_FEATURE the \p dwAttrId attribute is not 
supported by the driver (\ref SCARD_E_UNSUPPORTED_FEATURE)
  * @retval SCARD_E_NOT_TRANSACTED the driver returned an error (\ref 
SCARD_E_NOT_TRANSACTED)
  * @retval SCARD_E_INSUFFICIENT_BUFFER \p cbAttrLen is too big (\ref 
SCARD_E_INSUFFICIENT_BUFFER)
- * @retval SCARD_E_INSUFFICIENT_BUFFER Reader buffer not large enough (\ref 
SCARD_E_INSUFFICIENT_BUFFER)
+ * @retval SCARD_E_INSUFFICIENT_BUFFER \p pbAttr buffer not large enough. In 
that case the expected buffer size is indicated in \p *pcbAttrLen (\ref 
SCARD_E_INSUFFICIENT_BUFFER)
  * @retval SCARD_E_INVALID_HANDLE Invalid \p hCard handle (\ref 
SCARD_E_INVALID_HANDLE)
  * @retval SCARD_E_INVALID_PARAMETER A parameter is NULL and should not (\ref 
SCARD_E_INVALID_PARAMETER)
  * @retval SCARD_E_NO_MEMORY Memory allocation failed (\ref SCARD_E_NO_MEMORY)
@@ -2340,14 +2353,19 @@
  * SCARDCONTEXT hContext;
  * SCARDHANDLE hCard;
  * DWORD dwActiveProtocol;
- * unsigned char pbAtr[MAX_ATR_SIZE];
- * DWORD dwAtrLen;
+ * unsigned char *pbAttr;
+ * DWORD dwAttrLen;
  * ...
  * rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
  * rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
  *          SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
- * dwAtrLen = sizeof(pbAtr);
- * rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAtr, &dwAtrLen);
+ * rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, NULL, &dwAttrLen);
+ * if (SCARD_S_SUCCESS == rv)
+ * {
+ *     pbAttr = malloc(dwAttrLen);
+ *     rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAttr, &dwAttrLen);
+ *     free(pbAttr);
+ * }
  * @endcode
  *
  * @code
@@ -2490,11 +2508,16 @@
 
        scGetSetStruct.hCard = hCard;
        scGetSetStruct.dwAttrId = dwAttrId;
-       scGetSetStruct.cbAttrLen = *pcbAttrLen;
        scGetSetStruct.rv = SCARD_E_NO_SERVICE;
        memset(scGetSetStruct.pbAttr, 0, sizeof(scGetSetStruct.pbAttr));
        if (SCARD_SET_ATTRIB == command)
+       {
                memcpy(scGetSetStruct.pbAttr, pbAttr, *pcbAttrLen);
+               scGetSetStruct.cbAttrLen = *pcbAttrLen;
+       }
+       else
+               /* we can get up to the communication buffer size */
+               scGetSetStruct.cbAttrLen = sizeof scGetSetStruct.pbAttr;
 
        rv = MessageSendWithHeader(command, currentContextMap->dwClientID,
                sizeof(scGetSetStruct), &scGetSetStruct);
@@ -2518,7 +2541,12 @@
                 */
                if (*pcbAttrLen < scGetSetStruct.cbAttrLen)
                {
+                       /* restrict the value of scGetSetStruct.cbAttrLen to 
avoid a
+                        * buffer overflow in the memcpy() bellow */
+                       DWORD correct_value = scGetSetStruct.cbAttrLen;
                        scGetSetStruct.cbAttrLen = *pcbAttrLen;
+                       *pcbAttrLen = correct_value;
+
                        scGetSetStruct.rv = SCARD_E_INSUFFICIENT_BUFFER;
                }
                else


Reply via email to