⬢ DragonFlyBSD Kernel Audit
DF-5540 / fix.diff
← back to finding ↓ download raw
--- a/sys/bus/u4b/serial/uark.c
+++ b/sys/bus/u4b/serial/uark.c
@@ -74,6 +74,9 @@
 #define	UARK_CONFIG_INDEX	0
 #define	UARK_IFACE_INDEX	0
 
+/* bounded timeout for cfg-path (tty ioctl / open / close) EP0 requests */
+#define	UARK_CFG_TIMEOUT	250	/* ms */
+
 enum {
 	UARK_BULK_DT_WR,
 	UARK_BULK_DT_RD,
@@ -110,7 +113,8 @@
 static void	uark_cfg_get_status(struct ucom_softc *, uint8_t *,
 		    uint8_t *);
 static void	uark_cfg_set_break(struct ucom_softc *, uint8_t);
-static void	uark_cfg_write(struct uark_softc *, uint16_t, uint16_t);
+static usb_error_t uark_cfg_write(struct uark_softc *, uint16_t,
+		    uint16_t);
 static void	uark_poll(struct ucom_softc *ucom);
 
 static const struct usb_config
@@ -358,10 +362,14 @@
 	 */
 	data = (UARK_BAUD_REF + (speed / 2)) / speed;
 
-	uark_cfg_write(sc, 3, 0x83);
-	uark_cfg_write(sc, 0, data & 0xFF);
-	uark_cfg_write(sc, 1, data >> 8);
-	uark_cfg_write(sc, 3, 0x03);
+	if (uark_cfg_write(sc, 3, 0x83) != 0)
+		return;
+	if (uark_cfg_write(sc, 0, data & 0xFF) != 0)
+		return;
+	if (uark_cfg_write(sc, 1, data >> 8) != 0)
+		return;
+	if (uark_cfg_write(sc, 3, 0x03) != 0)
+		return;
 
 	if (t->c_cflag & CSTOPB)
 		data = UARK_STOP_BITS_2;
@@ -391,7 +399,8 @@
 		data |= UARK_SET_DATA_BITS(8);
 		break;
 	}
-	uark_cfg_write(sc, 3, 0x00);
+	if (uark_cfg_write(sc, 3, 0x00) != 0)
+		return;
 	uark_cfg_write(sc, 3, data);
 }
 
@@ -414,7 +423,7 @@
 	uark_cfg_write(sc, 4, onoff ? 0x01 : 0x00);
 }
 
-static void
+static usb_error_t
 uark_cfg_write(struct uark_softc *sc, uint16_t index, uint16_t value)
 {
 	struct usb_device_request req;
@@ -426,12 +435,13 @@
 	USETW(req.wIndex, index);
 	USETW(req.wLength, 0);
 
-	err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom, 
-	    &req, NULL, 0, 1000);
+	err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
+	    &req, NULL, 0, UARK_CFG_TIMEOUT);
 	if (err) {
-		DPRINTFN(0, "device request failed, err=%s "
-		    "(ignored)\n", usbd_errstr(err));
+		DPRINTFN(0, "device request failed, err=%s\n",
+		    usbd_errstr(err));
 	}
+	return (err);
 }
 
 static void