Module Name:    src
Committed By:   riastradh
Date:           Mon Mar 28 12:44:37 UTC 2022

Modified Files:
        src/sys/dev/usb: uhidev.c uhidev.h

Log Message:
uhidev(9): Define UHIDEV_MAXREPID = 255.

Report ids are limited by the HID spec to a single byte.

- Clamp max report id in report descriptor to this.

- Prune dead refcnt-overflow error branches.  Assert instead.


To generate a diff of this commit:
cvs rdiff -u -r1.91 -r1.92 src/sys/dev/usb/uhidev.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/usb/uhidev.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/uhidev.c
diff -u src/sys/dev/usb/uhidev.c:1.91 src/sys/dev/usb/uhidev.c:1.92
--- src/sys/dev/usb/uhidev.c:1.91	Mon Mar 28 12:44:28 2022
+++ src/sys/dev/usb/uhidev.c	Mon Mar 28 12:44:37 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: uhidev.c,v 1.91 2022/03/28 12:44:28 riastradh Exp $	*/
+/*	$NetBSD: uhidev.c,v 1.92 2022/03/28 12:44:37 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2001, 2012 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.91 2022/03/28 12:44:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhidev.c,v 1.92 2022/03/28 12:44:37 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -458,7 +458,7 @@ uhidev_maxrepid(void *buf, int len)
 		if ((int)h.report_ID > maxid)
 			maxid = h.report_ID;
 	hid_end_parse(d);
-	return maxid;
+	return MIN(maxid, UHIDEV_MAXREPID);
 }
 
 static int
@@ -671,11 +671,11 @@ uhidev_open_pipes(struct uhidev_softc *s
 
 	/*
 	 * If the pipes are already open, just increment the reference
-	 * count, or fail if it would overflow.
+	 * count.  The reference count is limited by the number of
+	 * report ids, so this can't overflow.
 	 */
 	if (sc->sc_refcnt) {
-		if (sc->sc_refcnt == INT_MAX)
-			return EBUSY;
+		KASSERT(sc->sc_refcnt < UHIDEV_MAXREPID);
 		sc->sc_refcnt++;
 		return 0;
 	}
@@ -700,12 +700,9 @@ uhidev_open_pipes(struct uhidev_softc *s
 	if (error)
 		goto out;
 	if (sc->sc_refcnt) {
-		if (sc->sc_refcnt == INT_MAX) {
-			error = EBUSY;
-		} else {
-			sc->sc_refcnt++;
-			error = 0;
-		}
+		KASSERT(sc->sc_refcnt < UHIDEV_MAXREPID);
+		sc->sc_refcnt++;
+		error = 0;
 		goto out0;
 	}
 	mutex_exit(&sc->sc_lock);

Index: src/sys/dev/usb/uhidev.h
diff -u src/sys/dev/usb/uhidev.h:1.26 src/sys/dev/usb/uhidev.h:1.27
--- src/sys/dev/usb/uhidev.h:1.26	Mon Mar 28 12:44:17 2022
+++ src/sys/dev/usb/uhidev.h	Mon Mar 28 12:44:37 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: uhidev.h,v 1.26 2022/03/28 12:44:17 riastradh Exp $	*/
+/*	$NetBSD: uhidev.h,v 1.27 2022/03/28 12:44:37 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -54,5 +54,6 @@ usbd_status uhidev_write_async(struct uh
     usbd_callback, void *);
 
 #define	UHIDEV_OSIZE	64
+#define	UHIDEV_MAXREPID	255
 
 #endif	/* _DEV_USB_UHIDEV_H_ */

Reply via email to