[Spice-devel] [usbredir PATCH 6/6] usbredirfilter: fix filter parsing for windows (mingw)

Hans de Goede hdegoede at redhat.com
Thu May 3 23:47:46 PDT 2012


Hi,

On 05/03/2012 06:09 PM, Christophe Fergeau wrote:
> On Thu, May 03, 2012 at 06:04:39PM +0300, Uri Lublin wrote:
>> From: Arnon Gilboa<agilboa at redhat.com>
>>
>> no strtok_r (reentrent) available, so use strtok instead.
>
> Wouldn't it be safer to use strtok_s? Any application using threads and
> strtok and libusbredirparser could get issues with this change no?

I have to agree with Christophe here, I would really like to keep
this code safe for calling from multiple threads, even if that
means some #ifdef stuff.

>> Modified-by: Uri Lublin<uril at redhat.com>
>> ---
>>   usbredirparser/usbredirfilter.c |   16 +++++++++++-----
>>   1 files changed, 11 insertions(+), 5 deletions(-)
>>
>> diff --git a/usbredirparser/usbredirfilter.c b/usbredirparser/usbredirfilter.c
>> index b74c921..a1213cc 100644
>> --- a/usbredirparser/usbredirfilter.c
>> +++ b/usbredirparser/usbredirfilter.c
>> @@ -29,7 +29,7 @@ int usbredirfilter_string_to_rules(
>>       const char *filter_str, const char *token_sep, const char *rule_sep,
>>       struct usbredirfilter_rule **rules_ret, int *rules_count_ret)
>>   {
>> -    char *rule, *rule_saveptr, *token, *token_saveptr, *ep;
>> +    char *rule, *token, *ep, *buf_end, *rule_end;
>>       struct usbredirfilter_rule *rules = NULL;
>>       int i, rules_count, *values, ret = 0;
>>       char *buf = NULL;
>> @@ -63,17 +63,19 @@ int usbredirfilter_string_to_rules(
>>       }
>>
>>       /* And actually parse the string */
>> +    buf_end = buf + strlen(buf);
>>       rules_count = 0;
>> -    rule = strtok_r(buf, rule_sep,&rule_saveptr);
>> +    rule = strtok(buf, rule_sep);
>>       while (rule) {
>> +        rule_end = rule + strlen(rule);
>>           /* We treat the filter rule as an array of ints for easier parsing */
>>           values = (int *)&rules[rules_count];
>> -        token = strtok_r(rule, token_sep,&token_saveptr);
>> +        token = strtok(rule, token_sep);
>>           for (i = 0; i<  5&&  token; i++) {
>>               values[i] = strtol(token,&ep, 0);
>>               if (*ep)
>>                   break;
>> -            token = strtok_r(NULL, token_sep,&token_saveptr);
>> +            token = strtok(NULL, token_sep);
>>           }
>>           if (i != 5 || token != NULL ||
>>                   usbredirfilter_verify(&rules[rules_count], 1)) {
>> @@ -81,7 +83,11 @@ int usbredirfilter_string_to_rules(
>>               goto leave;
>>           }
>>           rules_count++;
>> -        rule = strtok_r(NULL, rule_sep,&rule_saveptr);
>> +        if (rule_end<  buf_end) {
>> +            rule = strtok(rule_end + 1, rule_sep);
>> +        } else {
>> +            rule = NULL;
>> +        }
>
> rule = strtok(NULL, rule_sep); didn't work there? I'm bad with
> strtok/strtok_r, but by reading the manpage, it doesn't seem things should
> be handled differently there.

Again I agree with Christophe :)

All the other patches are ok. I don't know if you've noticed it yet,
but usbredir has an official git repo here now:
http://cgit.freedesktop.org/spice/usbredir/

Feel free to push the other patches there (since it is part of the
spice group git repos you should have commit access).

Regards,

Hans


More information about the Spice-devel mailing list