[Spice-devel] [usbredir PATCH] usbredirfilter_check: block device if all its interfaces skipped

Uri Lublin uril at redhat.com
Wed Jul 8 09:22:19 PDT 2015


Hi Hans,

Thanks for the quick review.
See answers below

On Wed, 2015-07-08 at 15:45 +0200, Hans de Goede wrote:
> Hi,
> 
> On 08-07-15 15:26, Uri Lublin wrote:
> > See usbredirfilter.h for when interfaces are skipped.
> > 
> > Fixes rhbz#1179210
> 
> Sigh, the kvm in question is really messed up as it uses non 
> bootclass hid interfaces,
> that means it won't work in many BIOS' etc. What a mess ...
> 
> > ---
> >   usbredirparser/usbredirfilter.c | 11 ++++++++---
> >   1 file changed, 8 insertions(+), 3 deletions(-)
> > 
> > diff --git a/usbredirparser/usbredirfilter.c 
> > b/usbredirparser/usbredirfilter.c
> > index ef9c63a..5cbbfbf 100644
> > --- a/usbredirparser/usbredirfilter.c
> > +++ b/usbredirparser/usbredirfilter.c
> > @@ -172,7 +172,7 @@ int usbredirfilter_check(
> >       uint16_t vendor_id, uint16_t product_id, uint16_t 
> > device_version_bcd,
> >       int flags)
> >   {
> > -    int i, rc;
> > +    int i, rc, num_skipped=0;
> > 
> >       if (usbredirfilter_verify(rules, rules_count))
> >           return -EINVAL;
> > @@ -190,9 +190,10 @@ int usbredirfilter_check(
> >       for (i = 0; i < interface_count; i++) {
> >           if (!(flags & usbredirfilter_fl_dont_skip_non_boot_hid) 
> > &&
> >                   interface_count > 1 && interface_class[i] == 0x03 
> > &&
> > -                interface_subclass[i] == 0x00 && 
> > interface_protocol[i] == 0x00)
> > +                interface_subclass[i] == 0x00 && 
> > interface_protocol[i] == 0x00) {
> > +            num_skipped++;
> >               continue;
> > -
> > +	}
> >           rc = usbredirfilter_check1(rules, rules_count, 
> > interface_class[i],
> >                                      vendor_id, product_id, 
> > device_version_bcd,
> >                                      flags & 
> > usbredirfilter_fl_default_allow);
> > @@ -200,6 +201,10 @@ int usbredirfilter_check(
> >               return rc;
> >       }
> > 
> > +    /* If all interfaces were skipped, block the device */
> > +    if (num_skipped == interface_count)
> > +	return -ENOENT;
> > +
> >       return 0;
> >   }
> 
> This seems wrong, this means that if a user wants to redirect some 
> custom hid device,
> with just a single hid interface that it will always be blocked 
> because of this.

In that case interface_count==1 and it will not be skipped.

If that's not enough, see more below.

> 
> I suggest instead adding a vid/pid based list of devices on which to 
> not skip non
> boot compliant hid devices. This way if hid devices are allowed to be 
> redirected
> by the filter, the device can still be redirected, and in the default 
> case where
> hid devices are not allowed, we will skip the non-boot-hid skipping, 
> do the regular
> hid check, and block the device based on that.

That may work but I think it is complicated for users.
If they are going to use specific vid/pid, they might as
well add a filter-rule for those specific devices.

Also assume the filter used is block-all-devices
(-1,-1,-1,-1, 0). This will not be enough and the user
would have to provide the specific vid/uid list of such
weird devices (after failing the first time).

An alternative is to call usbredirfilter_check1 also
for cases that are skipped now, and pass an additional parameter
that means do-not-check-class.
That way a rule that allow/block a specific vid/pid will apply.

Thanks,
    Uri



More information about the Spice-devel mailing list