Hi, this change fixes a racecondition between a winscard server and clients. Feel free to message me, if my explanation below is not sufficient. I will try to provide more Information in this case.
Regards, Florian Kaiser Signed-off-by: Florian Kaiser <[email protected]> --- src/winscard_svc.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/winscard_svc.c b/src/winscard_svc.c index b551c20..fc5ec38 100644 --- a/src/winscard_svc.c +++ b/src/winscard_svc.c @@ -419,10 +419,31 @@ static void ContextThread(LPVOID newContext) READ_BODY(waStr) - /* add the client fd to the list */ + /* remove the client fd from the list */ waStr.rv = EHUnregisterClientForEvent(filedes); - WRITE_BODY(waStr) + /* After the client timed out it sends a + * CMD_STOP_WAITING_READER_STATE_CHANGE. + * Sometimes an event occurs which triggers + * MSGSignalClient, which unregisters the + * client from events and sends a + * wait_reader_state_change message to the + * client. The client interprets this message + * as an answer to its + * CMD_STOP_WAITING_READER_STATE_CHANGE. + * If we send another wait_reader_state_change + * message to the client it stays in its buffer + * until another Command is issued and this + * message appears as leading garbage in the + * commands answer. + * Therefore we should not send the + * wait_reader_state_change message here, if + * the client has already been unregisterd from + * events. + */ + if (waStr.rv != SCARD_F_INTERNAL_ERROR) { + WRITE_BODY(waStr) + } } break; -- 2.1.4 _______________________________________________ Pcsclite-muscle mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
