Here we go again, revert the second attempt to resolve the
authoranton <anton@openbsd.org>
Thu, 11 Nov 2021 07:04:45 +0000 (07:04 +0000)
committeranton <anton@openbsd.org>
Thu, 11 Nov 2021 07:04:45 +0000 (07:04 +0000)
UHIDEV_CLAIM_MULTIPLE_REPORTID conflict.

Breaks fido(4) as reported by gnezdo@

sys/dev/usb/uhidev.c
sys/dev/usb/uhidev.h

index 59e8949..3ce1684 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uhidev.c,v 1.98 2021/11/10 06:33:30 anton Exp $       */
+/*     $OpenBSD: uhidev.c,v 1.99 2021/11/11 07:04:45 anton Exp $       */
 /*     $NetBSD: uhidev.c,v 1.14 2003/03/11 16:44:00 augustss Exp $     */
 
 /*
@@ -246,37 +246,30 @@ uhidev_attach(struct device *parent, struct device *self, void *aux)
        sc->sc_isize += (nrepid != 1);  /* one byte for the report ID */
        DPRINTF(("uhidev_attach: isize=%d\n", sc->sc_isize));
 
-       memset(&uha, 0, sizeof(uha));
        uha.uaa = uaa;
        uha.parent = sc;
+       uha.reportid = UHIDEV_CLAIM_MULTIPLE_REPORTID;
+       uha.nreports = nrepid;
+       uha.claimed = malloc(nrepid, M_TEMP, M_WAITOK|M_ZERO);
 
        /* Look for a driver claiming multiple report IDs first. */
-       if (nrepid > 1) {
-               uha.reportid = UHIDEV_CLAIM_MULTIPLE_REPORTID;
-               uha.nreports = nrepid;
-               uha.claimed = malloc(nrepid, M_TEMP, M_WAITOK|M_ZERO);
-
-               dev = config_found_sm(self, &uha, NULL, NULL);
-               if (dev != NULL) {
-                       for (repid = 0; repid < nrepid; repid++) {
-                               /*
-                                * Could already be assigned by
-                                * uhidev_set_report_dev().
-                                */
-                               if (sc->sc_subdevs[repid] != NULL)
-                                       continue;
-
-                               if (!uha.claimed[repid])
-                                       continue;
+       dev = config_found_sm(self, &uha, NULL, NULL);
+       if (dev != NULL) {
+               for (repid = 0; repid < nrepid; repid++) {
+                       /*
+                        * Could already be assigned by uhidev_set_report_dev().
+                        */
+                       if (sc->sc_subdevs[repid] != NULL)
+                               continue;
+
+                       if (uha.claimed[repid])
                                sc->sc_subdevs[repid] = (struct uhidev *)dev;
-                       }
                }
-
-               free(uha.claimed, M_TEMP, nrepid);
-               uha.nreports = 0;
-               uha.claimed = NULL;
        }
 
+       free(uha.claimed, M_TEMP, nrepid);
+       uha.claimed = NULL;
+
        for (repid = 0; repid < nrepid; repid++) {
                DPRINTF(("%s: try repid=%d\n", __func__, repid));
                if (hid_report_size(desc, size, hid_input, repid) == 0 &&
index d825a08..b2b7608 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uhidev.h,v 1.36 2021/11/10 06:33:30 anton Exp $       */
+/*     $OpenBSD: uhidev.h,v 1.37 2021/11/11 07:04:45 anton Exp $       */
 /*     $NetBSD: uhidev.h,v 1.3 2002/10/08 09:56:17 dan Exp $   */
 
 /*
@@ -75,8 +75,8 @@ struct uhidev_attach_arg {
        struct usb_attach_arg   *uaa;
        struct uhidev_softc     *parent;
        uint8_t                  reportid;
-#define        UHIDEV_CLAIM_MULTIPLE_REPORTID  0
-       u_int                    nreports;
+#define        UHIDEV_CLAIM_MULTIPLE_REPORTID  255
+       uint8_t                  nreports;
        uint8_t                 *claimed;
 };