[Pcsclite-muscle] Rare race condition in SCardGetStatusChange()

Ludovic Rousseau ludovic.rousseau at gmail.com
Tue Apr 17 07:42:07 PDT 2018


2018-04-17 15:12 GMT+02:00 Maximilian Stein <maximilian.stein at secunet.com>:
> Hello all,

Hello,

> recently we stumbled upon another (rare) race condition in the
> SCardGetStatusChange() function. I especially ask Maksim Ivanov and
> Florian Kaiser kindly to share their opinion about the problem and the
> proposed fix, since they did a good job in improving
> SCardGetStatusChange/SCardCancel in the recent past.

Nice explanation. Thanks.

> Suggestion for a fix:
> The proposed fix makes fetching the reader states and registering for
> event notifications an atomic action. The command
> CMD_WAIT_READER_STATE_CHANGE expected no return value anyway, so I made
> it return the reader states equal to CMD_GET_READERS_STATE. The action
> is protected by the ClientsWaitingForEvent_lock in eventhandler.c, which
> prevents parallel calls of MSGSignalClient() via
> EHSignalEventToClients(). This is necessary to prevent a signal before
> the reader states are sent, which would appear as garbage in the client
> socket.
>
> With the proposed fix, the client is registered for events after the
> reader states were fetched. So if any difference is found in the local
> and remote state (so that SCardGetStatusChange() returns) we have to
> unregister from events. This was not necessary before, but works just
> like unregistering after a timeout. This could be refined by checking
> why the loop was exited and only unregister if necessary.

In CMD_WAIT_READER_STATE_CHANGE case you add:
+#ifdef USE_USB
+                /* wait until all readers are ready */
+                RFWaitForReaderInit();
+#endif

Why?

Bye

-- 
 Dr. Ludovic Rousseau



More information about the pcsclite-muscle mailing list