[Spice-devel] [xf86-video-qxl] Enable smartcard support for XSpice.

Jeremy White jwhite at codeweavers.com
Fri Nov 21 07:03:17 PST 2014


Thanks for the careful review.

>> +static void push_apdu(smartcard_ccid_t *ccid, void *data, int len)
>> +{
>> +    apdu_t *a = calloc(1, sizeof(*a) + len);
>> +    apdu_t **p;
>> +
>> +    a->data = malloc(len);
>> +    memcpy(a->data, data, len);
>
> 1. No need to add ( + len ) to the calloc above
>      as a->data is malloced.
>      Is that space is used somewhere else  ?

No, you're right; that's a leftover from a different approach.

> 2. missing a->len = len

*blush*  Deleted some debugging before sending...deleted one line too many.

> 3. Nitpick: I think it's more readable to explicitly add a->next = NULL
>      even though it is 0 from the calloc (maybe use malloc
>      as all fields are set). Not that important.

I don't feel strongly; I'll change it as a form of thanks <grin>.

>> +static void * lun_thread(void *arg)
>> +{
>> +    char buf[8096];
>> +    static int pos = 0;
>
> Why have pos static (especially when buf is not) ?

Artifact of an earlier implementation; good catch.

>> +    for (i = 0; i < MAX_LUNS; i++)
>> +        if (luns[i].fd != -1 && luns[i].lun == Lun) {
>> +            while (p = pop_apdu(&luns[i]))
>> +                free_apdu(p);
>
> Are those left-overs from previous commands ?
> Are those apdu not important enough to be processed ?
>
> Reading below I see that some (all?) of those are "late" apdu's
> coming in after the timeout.

I think you mostly answered this one.

To be fair, this code is solving a theoretical problem, not one I 
encountered in testing.  I think the reasonable, if unlikely, case is an 
instance where an application requests data from a smart card, but then 
either aborts or times out, without clearing the response from the pipeline.

>
>> +
>> +            if (send_tx_buffer(&luns[i], TxBuffer, TxLength)) {
>> +                for (j = 0; j < TX_MAX_SLEEP; j++)
>> +                    if (p = pop_apdu(&luns[i]))
>> +                        break;
>> +                    else
>> +                        usleep(TX_SLEEP_INTERVAL);
>> +
>> +                if (p) {
>> +                    memcpy(RxBuffer, p->data, MIN(p->len, *RxLength));
>> +                    *RxLength = MIN(p->len, *RxLength);
>> +                    free_apdu(p);
>> +                    return IFD_SUCCESS;
>> +                }
> maybe better here: else return IFD_RESPONSE_TIMEOUT

Yes.

>> +            }
>> +        }
>> +    return IFD_ERROR_NOT_SUPPORTED;
> and here IFD_ICC_NOT_PRESENT  (?)

I think actually IFD_NO_SUCH_DEVICE would be more correct.

>> +    unlink(qxl->smartcard_file);
>
> Another nitpick:
> I see the vdagent unix-domain-socket file is not
> unlinked in the code. It is done in scripts/Xspice.

Hmm.  I'm not sure why Alon chose to do it that way.

But the unlink feels right to me; I can't think of a benefit of removing 
it.  And removing it would create a perpetual chore for any caller 
(whether script or otherwise).

Cheers,

Jeremy


More information about the Spice-devel mailing list