First in what will probably be a slow trickle, as I split my original big diff 
into more-easily reviewed chunks and test each in sequence.

This patch makes upd_attach less confusing:
1. Ignore all bogus report IDs up front, they shouldn't be queried.
2. When a sensor is attached, it will be found by upd_lookup_sensor, so don’t 
check attached.

Thanks.

--david

--- a/upd.c
+++ b/upd.c
@@ -183,7 +183,8 @@ upd_attach(struct device *parent, struct
             sc->sc_num_sensors < sc->sc_max_sensors; ) {
                DPRINTF(("upd: repid=%d\n", item.report_ID));
                if (item.kind != hid_feature ||
-                   item.report_ID < 0)
+                   item.report_ID < 0 ||
+                   item.report_ID >= sc->sc_max_repid)
                        continue;
 
                if ((entry = upd_lookup_usage_entry(&item)) == NULL)
@@ -192,11 +193,10 @@ upd_attach(struct device *parent, struct
                /* filter repeated usages, avoid duplicated sensors */
                sensor = upd_lookup_sensor(sc, entry->usage_pg,
                    entry->usage_id);
-               if (sensor && sensor->attached)
+               if (sensor != NULL)
                        continue;
 
                sensor = &sc->sc_sensors[sc->sc_num_sensors];
-               /* keep our copy of hid_item */
                memcpy(&sensor->hitem, &item, sizeof(struct hid_item));
                strlcpy(sensor->ksensor.desc, entry->usage_name,
                    sizeof(sensor->ksensor.desc));
@@ -208,8 +208,7 @@ upd_attach(struct device *parent, struct
                sensor->attached = 1;
                sc->sc_num_sensors++;
 
-               if (item.report_ID >= sc->sc_max_repid ||
-                   sc->sc_reports[item.report_ID].enabled)
+               if (sc->sc_reports[item.report_ID].enabled)
                        continue;
 
                sc->sc_reports[item.report_ID].size = hid_report_size(desc,


Reply via email to