<div dir="ltr"><div>I'm observing the same issue with pcsc-lite version 1.8.16 in OpenSC, where we've activated a blocking SCardGetStatusChange recently. As a result, OpenSC currently stalls Firefox when the browser is closed or the module is unloaded. See also the <a href="https://github.com/OpenSC/OpenSC/issues/1065">OpenSC ticket</a>.<br><br></div>Regards, Frank.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-06-14 11:43 GMT+02:00 Ran Benita <span dir="ltr"><<a href="mailto:ran234@gmail.com" target="_blank">ran234@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I have noticed a change in behavior in one of the recent pcsclite<br>
releases. I am using pcsclite 1.8.21 and ccid 1.4.27 on ArchLinux.<br>
<br>
The program below calls a blocking SCardGetStatusChange, but before that<br>
spwans a thread which waits for a key press, then calls SCardCancel (on<br>
the same context). It is a port of the Rust program here:<br>
<a href="https://raw.githubusercontent.com/bluetech/pcsc-rust/01bd4d80e366ef00f7006dabee45c8cb356d8566/pcsc/examples/cancel.rs" rel="noreferrer" target="_blank">https://raw.githubusercontent.<wbr>com/bluetech/pcsc-rust/<wbr>01bd4d80e366ef00f7006dabee45c8<wbr>cb356d8566/pcsc/examples/<wbr>cancel.rs</a><br>
<br>
Previously, the SCardCancel would return immediately and would cause<br>
SCardGetStatusChange to return SCARD_E_CANCELLED immediately.<br>
<br>
Now, SCardCancel blocks until SCardGetStatusChange times out, and only<br>
then returns SCARD_S_SUCCESS.<br>
<br>
Is this an intended change, or a regression? Or maybe I'm doing<br>
something wrong?<br>
<br>
Thanks,<br>
Ran<br>
<br>
// gcc -Wall -pthread $(pkg-config --libs --cflags libpcsclite) cancel.c -o cancel<br>
#include <stdio.h><br>
#include <unistd.h><br>
#include <assert.h><br>
#include <pthread.h><br>
<br>
#include <PCSC/winscard.h><br>
<br>
static SCARDCONTEXT context;<br>
<br>
static void *canceler_thread(void *arg) {<br>
    LONG ret;<br>
<br>
    getchar();<br>
<br>
    printf("Calling SCardCancel...\n");<br>
    ret = SCardCancel(context);<br>
    assert(ret == SCARD_S_SUCCESS);<br>
    printf("SCardCancel returned SCARD_S_SUCCESS\n");<br>
<br>
    return NULL;<br>
}<br>
<br>
int main(void) {<br>
    LONG ret;<br>
<br>
    ret = SCardEstablishContext(SCARD_<wbr>SCOPE_USER, NULL, NULL, &context);<br>
    assert(ret == SCARD_S_SUCCESS);<br>
<br>
    // Spawn a thread which waits for a key-press then cancels the operation.<br>
    pthread_t thread;<br>
    ret = pthread_create(&thread, NULL, canceler_thread, NULL);<br>
<br>
    // Set up the blocking call, and wait for cancel or timeout.<br>
    printf("Entering blocking call; press Enter to cancel\n");<br>
    SCARD_READERSTATE reader_states[] = {<br>
        {<br>
            .szReader = "\\\\?PnP?\\Notification",<br>
            .pvUserData = NULL,<br>
            .dwCurrentState = SCARD_STATE_UNAWARE,<br>
            .dwEventState = SCARD_STATE_UNAWARE,<br>
        },<br>
    };<br>
<br>
    ret = SCardGetStatusChange(context, 5000, reader_states, 1);<br>
    switch (ret) {<br>
    case SCARD_S_SUCCESS:<br>
        printf("Blocking call exited normally\n");<br>
        break;<br>
<br>
    case SCARD_E_CANCELLED:<br>
        printf("Blocking call canceled\n");<br>
        break;<br>
<br>
    case SCARD_E_TIMEOUT:<br>
        printf("Blocking call timed out\n");<br>
        break;<br>
<br>
    default:<br>
        fprintf(stderr, "Failed to get status changes: %ld", ret);<br>
        break;<br>
    }<br>
<br>
    printf("Sleeping before existing main thread...\n");<br>
    sleep(5);<br>
<br>
    return 0;<br>
}<br>
<br>
______________________________<wbr>_________________<br>
Pcsclite-muscle mailing list<br>
<a href="mailto:Pcsclite-muscle@lists.alioth.debian.org">Pcsclite-muscle@lists.alioth.<wbr>debian.org</a><br>
<a href="http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle" rel="noreferrer" target="_blank">http://lists.alioth.debian.<wbr>org/cgi-bin/mailman/listinfo/<wbr>pcsclite-muscle</a><br>
</blockquote></div><br></div>