pcscd jams when using '--auto-exit'

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

pcscd jams when using '--auto-exit'

Andre Florath
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
#Requires=pcscd.socket

[Service]
#ExecStart=/usr/sbin/pcscd --foreground --auto-exit
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



Tested with ReinerSCT cyberjack and ReinerSCT RFID basic card readers.
Tested with the driver from Debian and from the vendor itself.

ii  libifd-cyberjack6                 3.99.5final.sp07      amd64                 REINER SCT cyberJack USB chipcard reader user space driver

$ /usr/sbin/pcscd --version
pcsc-lite version 1.8.16.
Copyright (C) 1999-2002 by David Corcoran <[hidden email]>.
Copyright (C) 2001-2015 by Ludovic Rousseau <[hidden email]>.
Copyright (C) 2003-2004 by Damien Sauveron <[hidden email]>.
Report bugs to <[hidden email]>.
Enabled features: Linux x86_64-pc-linux-gnu serial usb libudev usbdropdir=/usr/lib/pcsc/drivers ipcdir=/var/run/pcscd configdir=/etc/reader.conf.d

This is the version from Stretch - but with 1.8.13-1 the same problem occurs.

Running Debian Jessie (8.3)

journald:
Apr 08 18:03:18 thynias pcscd[11053]: CYBERJACK: Started

(gdb) info threads
  Id   Target Id         Frame
  2    Thread 0x7f9a3f412700 (LWP 11056) "pcscd" 0x00007f9a40170d3d in poll () at ../sysdeps/unix/syscall-template.S:81
* 1    Thread 0x7f9a4107a700 (LWP 11053) "pcscd" 0x00007f9a40170d3d in poll () at ../sysdeps/unix/syscall-template.S:81
(gdb) bt
#0  0x00007f9a40170d3d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f9a3fc3dc07 in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#2  0x00007f9a3fc3e8d3 in libusb_handle_events_timeout_completed () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#3  0x00007f9a3fc3e9d0 in libusb_handle_events_completed () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#4  0x00007f9a3fc3f231 in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#5  0x00007f9a3fc3f309 in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#6  0x00007f9a3fc3f69f in libusb_bulk_transfer () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#7  0x00007f9a3fe7e552 in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#8  0x00007f9a3fe7cbbe in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#9  0x00007f9a3fe79944 in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#10 0x00007f9a3fe663be in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#11 0x00007f9a3fe6dc8a in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#12 0x00007f9a3fe6fa1a in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#13 0x00007f9a3fe6fbe6 in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#14 0x00007f9a3fe652fe in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#15 0x00007f9a3fe70326 in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#16 0x00007f9a3fe781fe in CReader::Connect() () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#17 0x00007f9a3fe63114 in ?? () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#18 0x00007f9a3fe634e8 in IFDHCreateChannelByName () from /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
#19 0x00007f9a40e9e40a in IFDOpenIFD ()
#20 0x00007f9a40ea00b3 in RFInitializeReader ()
#21 0x00007f9a40ea0a5d in RFAddReader ()
#22 0x00007f9a40ea6632 in HPAddDevice ()
#23 0x00007f9a40ea6e5e in HPRegisterForHotplugEvents ()
#24 0x00007f9a40e9a818 in main ()
(gdb) thread 2
[Switching to thread 2 (Thread 0x7f9a3f412700 (LWP 11056))]
#0  0x00007f9a40170d3d in poll () at ../sysdeps/unix/syscall-template.S:81
81 in ../sysdeps/unix/syscall-template.S
(gdb) bt
#0  0x00007f9a40170d3d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f9a3fc43fd8 in ?? () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#2  0x00007f9a404440a4 in start_thread (arg=0x7f9a3f412700) at pthread_create.c:309
#3  0x00007f9a4017987d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111


First start - everything is fine:

00000053 winscard_svc.c:343:ContextThread() Client die: 14
00000011 winscard_svc.c:986:MSGCleanupClient() Thread is stopping: dwClientID=14, threadContext @0x7fc9ef7f6d90
00000004 winscard_svc.c:992:MSGCleanupClient() Freeing SCONTEXT @0x7fc9ef7f6d90
00000003 winscard_svc.c:1007:MSGCleanupClient() Starting suicide alarm in 60 seconds
00344636 eventhandler.c:491:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00403458 eventhandler.c:479:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED
59251946 pcscdaemon.c:749:signal_trap() Received signal: 14
00000016 pcscdaemon.c:768:signal_trap() Preparing for suicide
00000204 hotplug_libudev.c:710:HPStopHotPluggables() Hotplug stopped
01000083 readerfactory.c:1350:RFCleanupReaders() entering cleaning function
00000019 readerfactory.c:1359:RFCleanupReaders() Stopping reader: REINER SCT cyberJack pp_a2 (3176975693) 00 00
00000007 readerfactory.c:605:RFRemoveReader() UnrefReader() count was: 1
00000006 eventhandler.c:176:EHDestroyEventHandler() Stomping thread.
00000009 eventhandler.c:205:EHDestroyEventHandler() Waiting polling thread
00325937 eventhandler.c:502:EHStatusHandlerThread() Die
00000081 eventhandler.c:216:EHDestroyEventHandler() Thread stomped.
00000017 readerfactory.c:1117:RFUnInitializeReader() Attempting shutdown of REINER SCT cyberJack pp_a2 (3176975693) 00 00.
00001290 readerfactory.c:988:RFUnloadReader() Unloading reader driver.
00000082 winscard_svc.c:152:ContextsDeinitialize() remaining threads: 0
00000007 pcscdaemon.c:693:at_exit() cleaning /var/run/pcscd
root@thynias:~#
root@thynias:~#

Second start: jammed!
Never stops - even not after 60 seconds. Also no additional logs after
60 seconds.

root@thynias:~# /usr/sbin/pcscd --foreground --debug --auto-exit -a
00000000 debuglog.c:289:DebugLogSetLevel() debug level=debug
00000041 pcscdaemon.c:331:main() Auto exit after 60 seconds of inactivity
00000010 debuglog.c:310:DebugLogSetCategory() Debug options: APDU
00000095 configfile.l:281:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000029 configfile.l:353:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000048 configfile.l:315:DBGetReaderListDir() Skipping non regular file: .
00000012 configfile.l:315:DBGetReaderListDir() Skipping non regular file: ..
00000012 pcscdaemon.c:567:main() pcsc-lite 1.8.16 daemon ready.
00001634 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/003/001
00000088 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/003/001
00000087 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x0C4B, PID: 0x0401, path: /dev/bus/usb/003/006
00000025 hotplug_libudev.c:433:HPAddDevice() Adding USB device: REINER SCT cyberJack pp_a2
00000046 readerfactory.c:1066:RFInitializeReader() Attempting startup of REINER SCT cyberJack pp_a2 (3176975693) 00 00 using /usr/lib/pcsc/drivers/libifd-cyberjack.bundle/Contents/Linux/libifd-cyberjack.so
CYBERJACK: Started
00001102 readerfactory.c:951:RFBindFunctions() Loading IFD Handler 3.0

What also not really helps at this point is to unplug and plug-in the
card reader

99999999 readerfactory.c:1097:RFInitializeReader() Open Port 0x200000 Failed (usb:0c4b/0401:libudev:0:/dev/bus/usb/003/006)
00000018 readerfactory.c:372:RFAddReader() REINER SCT cyberJack pp_a2 (3176975693) init failed.
00000007 readerfactory.c:605:RFRemoveReader() UnrefReader() count was: 1
00000005 readerfactory.c:1117:RFUnInitializeReader() Attempting shutdown of REINER SCT cyberJack pp_a2 (3176975693) 00 00.
00000004 readerfactory.c:988:RFUnloadReader() Unloading reader driver.
00000064 hotplug_libudev.c:520:HPAddDevice() Failed adding USB device: REINER SCT cyberJack pp_a2
00000154 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/004/001
00000075 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/004/001
00000073 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1058, PID: 0x10B8, path: /dev/bus/usb/004/002
00000068 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/004/001
00000071 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x05E3, PID: 0x0732, path: /dev/bus/usb/004/003
00000090 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000067 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000072 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0024, path: /dev/bus/usb/001/002
00000102 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/005/001
00000069 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/005/001
00000074 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x046D, PID: 0xC03E, path: /dev/bus/usb/005/002
00000068 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/005/001
00000074 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x0409, PID: 0x005A, path: /dev/bus/usb/005/003
00000076 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x0402, PID: 0x5602, path: /dev/bus/usb/005/004
00000072 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x0409, PID: 0x005A, path: /dev/bus/usb/005/003
00000098 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/006/001
00000097 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000063 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000066 hotplug_libudev.c:294:get_driver() Looking for a driver for VID: 0x8087, PID: 0x0024, path: /dev/bus/usb/002/002
Segmentation fault


_______________________________________________
Pcsclite-muscle mailing list
[hidden email]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
Reply | Threaded
Open this post in threaded view
|

Re: pcscd jams when using '--auto-exit'

Ludovic Rousseau
2016-04-09 8:06 GMT+02:00 Andre Florath <[hidden email]>:
Hello!

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
#Requires=pcscd.socket

[Service]
#ExecStart=/usr/sbin/pcscd --foreground --auto-exit
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.


Thanks for the bug report.

Can you test with the proposed version available at http://ludovic.rousseau.free.fr/softwares/pcsc-lite/pcsc-lite-1.8.16.tar.bz2

It should work but since I was not able to reproduce the problem myself I would like you to confirm the problem is fixed in this version before I commit the modification.

Thanks

--
 Dr. Ludovic Rousseau

_______________________________________________
Pcsclite-muscle mailing list
[hidden email]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
Reply | Threaded
Open this post in threaded view
|

Re: pcscd jams when using '--auto-exit'

Andre Florath
Hello!

> Can you test with the proposed version available at http://ludovic.rousseau.free.fr/softwares/pcsc-lite/pcsc-lite-1.8.16.tar.bz2
>
> It should work but since I was not able to reproduce the problem myself I would like you to confirm the problem is fixed in this version before I commit the modification.
>

Yes - tested it with --debug enabled.  Works fine for me -
tested it a couple of times (about 10);
With and without shutdown of pcscd. Also tested
using suspending my computer.

Attached you can find the logs of a shutdown.

Maybe one hint: now that you have more than one thread,
(in principle) it is forbidden to use non-thread-safe functions
like strerror. In mostly all cases this will work, but
in some (rare) cases you get undefined behavior.

Thank you very much!

Kind regards

Andre



Apr 23 20:22:24 thynias pcscd[17015]: 59434984 pcscdaemon.c:185:signal_thread() Received signal: 14
Apr 23 20:22:24 thynias pcscd[17015]: 00000016 pcscdaemon.c:216:signal_thread() Preparing for suicide
Apr 23 20:22:24 thynias pcscd[17015]: 00001223 hotplug_libudev.c:710:HPStopHotPluggables() Hotplug stopped
Apr 23 20:22:25 thynias pcscd[17015]: 01000087 readerfactory.c:1350:RFCleanupReaders() entering cleaning function
Apr 23 20:22:25 thynias pcscd[17015]: 00000018 readerfactory.c:1359:RFCleanupReaders() Stopping reader: REINER SCT cyberJack pp_a2 (3176975693) 00 00
Apr 23 20:22:25 thynias pcscd[17015]: 00000013 readerfactory.c:605:RFRemoveReader() UnrefReader() count was: 1
Apr 23 20:22:25 thynias pcscd[17015]: 00000005 eventhandler.c:176:EHDestroyEventHandler() Stomping thread.
Apr 23 20:22:25 thynias pcscd[17015]: 00000009 eventhandler.c:205:EHDestroyEventHandler() Waiting polling thread
Apr 23 20:22:25 thynias pcscd[17015]: 00152808 eventhandler.c:502:EHStatusHandlerThread() Die
Apr 23 20:22:25 thynias pcscd[17015]: 00000085 eventhandler.c:216:EHDestroyEventHandler() Thread stomped.
Apr 23 20:22:25 thynias pcscd[17015]: 00000012 readerfactory.c:1117:RFUnInitializeReader() Attempting shutdown of REINER SCT cyberJack pp_a2 (3176975693) 00 00.
Apr 23 20:22:25 thynias pcscd[17015]: 00001383 readerfactory.c:988:RFUnloadReader() Unloading reader driver.
Apr 23 20:22:25 thynias pcscd[17015]: 00000070 winscard_svc.c:152:ContextsDeinitialize() remaining threads: 0
Apr 23 20:22:25 thynias pcscd[17015]: 00000006 pcscdaemon.c:789:at_exit() cleaning /var/run/pcscd


_______________________________________________
Pcsclite-muscle mailing list
[hidden email]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
Reply | Threaded
Open this post in threaded view
|

Re: pcscd jams when using '--auto-exit'

Ludovic Rousseau
2016-04-23 20:59 GMT+02:00 Andre Florath <[hidden email]>:
Hello!

> Can you test with the proposed version available at http://ludovic.rousseau.free.fr/softwares/pcsc-lite/pcsc-lite-1.8.16.tar.bz2
>
> It should work but since I was not able to reproduce the problem myself I would like you to confirm the problem is fixed in this version before I commit the modification.
>

Yes - tested it with --debug enabled.  Works fine for me -
tested it a couple of times (about 10);
With and without shutdown of pcscd. Also tested
using suspending my computer.

Thanks for the feedback.

Maybe one hint: now that you have more than one thread,
(in principle) it is forbidden to use non-thread-safe functions
like strerror. In mostly all cases this will work, but
in some (rare) cases you get undefined behavior.

Exact. I should use strerror_r(3) instead.
Thanks

--
 Dr. Ludovic Rousseau

_______________________________________________
Pcsclite-muscle mailing list
[hidden email]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle