Hi,

On 14-07-15 17:30, Uri Lublin wrote:
See usbredirfilter.h for when interfaces are skipped.

Force filter check on such a device by calling recursively with
a flag that forbids skipping (usbredirfilter_fl_dont_skip_non_boot_hid)

Related rhbz#1179210

Looks good to me:

Reviewed-by: Hans de Goede <[email protected]>

Regards,

Hans



---

v1->v2: In v1 such a case was handled by blocking the device.

---
  usbredirparser/usbredirfilter.c | 21 ++++++++++++++++++---
  1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/usbredirparser/usbredirfilter.c b/usbredirparser/usbredirfilter.c
index ef9c63a..02184ef 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,20 @@ int usbredirfilter_check(
              return rc;
      }

+    /* If all interfaces were skipped, then force check on that device,
+     * by recursively calling this function with a flag that forbids
+     * skipping (usbredirfilter_fl_dont_skip_non_boot_hid)
+     */
+    if (num_skipped == interface_count) {
+        rc = usbredirfilter_check(rules, rules_count,
+                                  device_class, device_subclass, 
device_protocol,
+                                  interface_class, interface_subclass,
+                                  interface_protocol, interface_count,
+                                  vendor_id, product_id, device_version_bcd,
+                                  flags | 
usbredirfilter_fl_dont_skip_non_boot_hid);
+        return rc;
+    }
+
      return 0;
  }


_______________________________________________
Spice-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to