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

Submitted by Uri Lublin on July 8, 2015, 1:26 p.m.

Details

Message ID 1436361965-2900-1-git-send-email-uril@redhat.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Uri Lublin July 8, 2015, 1:26 p.m.
See usbredirfilter.h for when interfaces are skipped.

Fixes rhbz#1179210
---
 usbredirparser/usbredirfilter.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

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;
 }
 

Comments

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.

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.

Regards,

Hans
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
Hi,

On 08-07-15 18:22, Uri Lublin wrote:
> 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.

Right, so make it a device with 2 custom hid interfaces ...

> 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.

The skip in the filter is there so that for example a usb headset which
has both an audio interface and a usb=hid interface for the volume buttons
will not get filtered out as being a hid device.

> Also assume the filter used is block-all-devices
> (-1,-1,-1,-1, 0).

No by default for auto-redirect which is the problem here we use a filter
which filters out hid devices. Normally this works fine to not auto redirect
keyboards and mice since they have a hid interface which had an usb keyboard
boot interface subclass and as such will not trigger the skip checking for
this interface code. The problem here seems to be that a kvm is used which
only has non bootclass hid interfaces.

> 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).

No the idea is to have a blacklist inside usbredir for devices for which
the skip code should be skipped, the user will not have to do anything.

Can you ask the reporter to provide lsusb -v output for the usb interface
of the kvm in question, then we can better analyse what exactly is going
wrong here. Perhaps my analyses of the problem is wrong.

Regards,

Hans

p.s.

I'm on vacation from July 11th - July 19th, so if I'm quiet that is why :)
Hi,

Thinking more about this I think I've a good solution.

If we end up skipping all interfaces, then do not return
-ENOENT, but rerun the filter with the
usbredirfilter_fl_dont_skip_non_boot_hid flag or-ed
into the flags argument.

That shhold fix the use case on hand while not overriding
the users intent if the user actually wants hid devices
to pass the filter.

Regards,

Hans
On Wed, Jul 08, 2015 at 07:36:40PM +0200, Hans de Goede wrote:
> Can you ask the reporter to provide lsusb -v output for the usb interface
> of the kvm in question, then we can better analyse what exactly is going
> wrong here. Perhaps my analyses of the problem is wrong.

Is https://bugzilla.redhat.com/attachment.cgi?id=980879 enough or do you
need something even more detailed?

Christophe
Hi,

On 09-07-15 09:19, Christophe Fergeau wrote:
> On Wed, Jul 08, 2015 at 07:36:40PM +0200, Hans de Goede wrote:
>> Can you ask the reporter to provide lsusb -v output for the usb interface
>> of the kvm in question, then we can better analyse what exactly is going
>> wrong here. Perhaps my analyses of the problem is wrong.
>
> Is https://bugzilla.redhat.com/attachment.cgi?id=980879 enough or do you
> need something even more detailed?

That is good enough, but all the hid devices in there have at least one
interface which has:

bInterfaceSubClass      1 Boot Interface Subclass

So atleast 1 interface will not be skipped for the filter check and the
Uri's patch will be a nop on these devices.

Regards,

Hans
On Thu, 2015-07-09 at 10:13 +0200, Hans de Goede wrote:
> Hi,
> 
> On 09-07-15 09:19, Christophe Fergeau wrote:
> > On Wed, Jul 08, 2015 at 07:36:40PM +0200, Hans de Goede wrote:
> > > Can you ask the reporter to provide lsusb -v output for the usb 
> > > interface
> > > of the kvm in question, then we can better analyse what exactly 
> > > is going
> > > wrong here. Perhaps my analyses of the problem is wrong.
> > 
> > Is https://bugzilla.redhat.com/attachment.cgi?id=980879 enough or 
> > do you
> > need something even more detailed?
> 
> That is good enough, but all the hid devices in there have at least 
> one
> interface which has:
> 
> bInterfaceSubClass      1 Boot Interface Subclass
> 
> So atleast 1 interface will not be skipped for the filter check and 
> the
> Uri's patch will be a nop on these devices.


I've tested with a different KVM switch device, see below its
descriptors.

The patch fixes the problem I found with "my" KVM device.

You are probably right it will not fix the problem in the bug.


---
Bus 002 Device 043: ID 10d5:55a4 Uni Class Technology Co., Ltd 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x10d5 Uni Class Technology Co., Ltd
  idProduct          0x55a4 
  bcdDevice            1.00
  iManufacturer           1 No brand
  iProduct                2 4 Port KVMSwicther
  iSerial                 3 04’
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           59
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          4 HID Mouse
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              7 Keyboard
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      65
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 No Subclass
      bInterfaceProtocol      0 None
      iInterface              6 Mouse
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      24
          Report Descriptor: (length is 24)
            Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
                            (null)
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Report Count, data= [ 0x08 ] 8
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Main  ): Output, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position
Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
Device Status:     0x0040
  (Bus Powered)
  Debug Mode

---

Thanks,
    Uri
Hi,

On 09-07-15 16:51, Uri Lublin wrote:
> On Thu, 2015-07-09 at 10:13 +0200, Hans de Goede wrote:
>> Hi,
>>
>> On 09-07-15 09:19, Christophe Fergeau wrote:
>>> On Wed, Jul 08, 2015 at 07:36:40PM +0200, Hans de Goede wrote:
>>>> Can you ask the reporter to provide lsusb -v output for the usb
>>>> interface
>>>> of the kvm in question, then we can better analyse what exactly
>>>> is going
>>>> wrong here. Perhaps my analyses of the problem is wrong.
>>>
>>> Is https://bugzilla.redhat.com/attachment.cgi?id=980879 enough or
>>> do you
>>> need something even more detailed?
>>
>> That is good enough, but all the hid devices in there have at least
>> one
>> interface which has:
>>
>> bInterfaceSubClass      1 Boot Interface Subclass
>>
>> So atleast 1 interface will not be skipped for the filter check and
>> the
>> Uri's patch will be a nop on these devices.
>
>
> I've tested with a different KVM switch device, see below its
> descriptors.
>
> The patch fixes the problem I found with "my" KVM device.

Looking at the descriptors for your kvm, yes that makes sense
(and those descriptors ar weird btw, as said this kvm will likely
not work with many BIOS-es).

> You are probably right it will not fix the problem in the bug.

Ok, so can you please respin the patch to re-call the filter function
with the usbredirfilter_fl_dont_skip_non_boot_hid flag or-ed
into the flags argument, rather then returning -ENOENT? This way e.g.
a vid:pid filter will still do what the user requested for devices
like your kvm, rather then always denying passthrough of them.

Regards,

Hans


>
>
> ---
> Bus 002 Device 043: ID 10d5:55a4 Uni Class Technology Co., Ltd
> Device Descriptor:
>    bLength                18
>    bDescriptorType         1
>    bcdUSB               1.10
>    bDeviceClass            0 (Defined at Interface level)
>    bDeviceSubClass         0
>    bDeviceProtocol         0
>    bMaxPacketSize0         8
>    idVendor           0x10d5 Uni Class Technology Co., Ltd
>    idProduct          0x55a4
>    bcdDevice            1.00
>    iManufacturer           1 No brand
>    iProduct                2 4 Port KVMSwicther
>    iSerial                 3 04’
>    bNumConfigurations      1
>    Configuration Descriptor:
>      bLength                 9
>      bDescriptorType         2
>      wTotalLength           59
>      bNumInterfaces          2
>      bConfigurationValue     1
>      iConfiguration          4 HID Mouse
>      bmAttributes         0x80
>        (Bus Powered)
>      MaxPower              100mA
>      Interface Descriptor:
>        bLength                 9
>        bDescriptorType         4
>        bInterfaceNumber        0
>        bAlternateSetting       0
>        bNumEndpoints           1
>        bInterfaceClass         3 Human Interface Device
>        bInterfaceSubClass      0 No Subclass
>        bInterfaceProtocol      0 None
>        iInterface              7 Keyboard
>          HID Device Descriptor:
>            bLength                 9
>            bDescriptorType        33
>            bcdHID               1.10
>            bCountryCode            0 Not supported
>            bNumDescriptors         1
>            bDescriptorType        34 Report
>            wDescriptorLength      65
>           Report Descriptors:
>             ** UNAVAILABLE **
>        Endpoint Descriptor:
>          bLength                 7
>          bDescriptorType         5
>          bEndpointAddress     0x81  EP 1 IN
>          bmAttributes            3
>            Transfer Type            Interrupt
>            Synch Type               None
>            Usage Type               Data
>          wMaxPacketSize     0x0008  1x 8 bytes
>          bInterval              10
>      Interface Descriptor:
>        bLength                 9
>        bDescriptorType         4
>        bInterfaceNumber        1
>        bAlternateSetting       0
>        bNumEndpoints           1
>        bInterfaceClass         3 Human Interface Device
>        bInterfaceSubClass      0 No Subclass
>        bInterfaceProtocol      0 None
>        iInterface              6 Mouse
>          HID Device Descriptor:
>            bLength                 9
>            bDescriptorType        33
>            bcdHID               1.10
>            bCountryCode            0 Not supported
>            bNumDescriptors         1
>            bDescriptorType        34 Report
>            wDescriptorLength      24
>            Report Descriptor: (length is 24)
>              Item(Global): Usage Page, data= [ 0x00 0xff ] 65280
>                              (null)
>              Item(Local ): Usage, data= [ 0x01 ] 1
>                              (null)
>              Item(Main  ): Collection, data= [ 0x01 ] 1
>                              Application
>              Item(Global): Logical Minimum, data= [ 0x00 ] 0
>              Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
>              Item(Local ): Usage Minimum, data= [ 0x00 ] 0
>                              (null)
>              Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
>                              (null)
>              Item(Global): Report Count, data= [ 0x08 ] 8
>              Item(Global): Report Size, data= [ 0x08 ] 8
>              Item(Main  ): Output, data= [ 0x02 ] 2
>                              Data Variable Absolute No_Wrap Linear
>                              Preferred_State No_Null_Position
> Non_Volatile Bitfield
>              Item(Main  ): End Collection, data=none
>        Endpoint Descriptor:
>          bLength                 7
>          bDescriptorType         5
>          bEndpointAddress     0x02  EP 2 OUT
>          bmAttributes            3
>            Transfer Type            Interrupt
>            Synch Type               None
>            Usage Type               Data
>          wMaxPacketSize     0x0008  1x 8 bytes
>          bInterval              10
> Device Status:     0x0040
>    (Bus Powered)
>    Debug Mode
>
> ---
>
> Thanks,
>      Uri
>
What happened to this patch? I was not able to find another similar
thread here and a similar solution wasn't pushed upstream.

Best Regards,
On Fri, Oct 16, 2015 at 9:55 AM, Fabiano Fidêncio <fabiano@fidencio.org> wrote:
> What happened to this patch? I was not able to find another similar
> thread here and a similar solution wasn't pushed upstream.

Okay, found the v2:
http://lists.freedesktop.org/archives/spice-devel/2015-July/020858.html

But it was never pushed. I will do this.

Best Regards,