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

Alon Levy alon at pobox.com
Fri Nov 21 07:43:02 PST 2014


On 11/21/2014 05:03 PM, Jeremy White wrote:
> 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).

I agree with both of you for what it's worth.

> 
> Cheers,
> 
> Jeremy
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list