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,