summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2019-01-13 14:30:16 +0000
committermpi <mpi@openbsd.org>2019-01-13 14:30:16 +0000
commit2bdc593d57756e20b55f5abf2c59a074ed26d46d (patch)
tree3f8762a7678bcd65dc96e9e8fa7959425804e758
parentValidate that the interface passed to *match() is the expected one (diff)
downloadwireguard-openbsd-2bdc593d57756e20b55f5abf2c59a074ed26d46d.tar.xz
wireguard-openbsd-2bdc593d57756e20b55f5abf2c59a074ed26d46d.zip
Validate the number of expected interfaces in *match() and claim them
during *attach(). This allows us to get rid of two calls to usbd_device2interface_handle() that could fail later. ok ratchov@, jcs@
-rw-r--r--sys/dev/usb/ubcmtp.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/sys/dev/usb/ubcmtp.c b/sys/dev/usb/ubcmtp.c
index b4554e5b7a1..ef1876df590 100644
--- a/sys/dev/usb/ubcmtp.c
+++ b/sys/dev/usb/ubcmtp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ubcmtp.c,v 1.18 2018/07/30 15:56:30 jcs Exp $ */
+/* $OpenBSD: ubcmtp.c,v 1.19 2019/01/13 14:30:16 mpi Exp $ */
/*
* Copyright (c) 2013-2014, joshua stein <jcs@openbsd.org>
@@ -331,7 +331,6 @@ struct ubcmtp_softc {
struct usbd_device *sc_udev;
struct device *sc_wsmousedev;
- int tp_ifacenum; /* trackpad interface number */
struct usbd_interface *sc_tp_iface; /* trackpad interface */
struct usbd_pipe *sc_tp_pipe; /* trackpad pipe */
int sc_tp_epaddr; /* endpoint addr */
@@ -339,7 +338,6 @@ struct ubcmtp_softc {
int tp_offset; /* finger offset into data */
uint8_t *tp_pkt;
- int bt_ifacenum; /* button interface number */
struct usbd_interface *sc_bt_iface; /* button interface */
struct usbd_pipe *sc_bt_pipe; /* button pipe */
int sc_bt_epaddr; /* endpoint addr */
@@ -398,6 +396,12 @@ ubcmtp_match(struct device *parent, void *match, void *aux)
uaa->product == ubcmtp_devices[i].ansi ||
uaa->product == ubcmtp_devices[i].iso ||
uaa->product == ubcmtp_devices[i].jis)) {
+ if (uaa->nifaces < 2)
+ return (UMATCH_NONE);
+ if ((ubcmtp_devices[i].type != UBCMTP_TYPE2) &&
+ (uaa->nifaces < 3))
+ return (UMATCH_NONE);
+
/*
* The USB keyboard/mouse device will have one keyboard
* HID and two mouse HIDs, though only one will have a
@@ -455,29 +459,34 @@ ubcmtp_attach(struct device *parent, struct device *self, void *aux)
case UBCMTP_TYPE1:
sc->tp_maxlen = UBCMTP_TYPE1_TPLEN;
sc->tp_offset = UBCMTP_TYPE1_TPOFF;
- sc->tp_ifacenum = UBCMTP_TYPE1_TPIFACE;
+ sc->sc_tp_iface = uaa->ifaces[UBCMTP_TYPE1_TPIFACE];
+ usbd_claim_iface(sc->sc_udev, UBCMTP_TYPE1_TPIFACE);
/* button offsets */
sc->bt_maxlen = sizeof(struct ubcmtp_button);
- sc->bt_ifacenum = UBCMTP_TYPE1_BTIFACE;
+ sc->sc_bt_iface = uaa->ifaces[UBCMTP_TYPE1_BTIFACE];
+ usbd_claim_iface(sc->sc_udev, UBCMTP_TYPE1_BTIFACE);
break;
case UBCMTP_TYPE2:
sc->tp_maxlen = UBCMTP_TYPE2_TPLEN;
sc->tp_offset = UBCMTP_TYPE2_TPOFF;
- sc->tp_ifacenum = UBCMTP_TYPE2_TPIFACE;
+ sc->sc_tp_iface = uaa->ifaces[UBCMTP_TYPE2_TPIFACE];
+ usbd_claim_iface(sc->sc_udev, UBCMTP_TYPE2_TPIFACE);
break;
case UBCMTP_TYPE3:
sc->tp_maxlen = UBCMTP_TYPE3_TPLEN;
sc->tp_offset = UBCMTP_TYPE3_TPOFF;
- sc->tp_ifacenum = UBCMTP_TYPE3_TPIFACE;
+ sc->sc_tp_iface = uaa->ifaces[UBCMTP_TYPE3_TPIFACE];
+ usbd_claim_iface(sc->sc_udev, UBCMTP_TYPE3_TPIFACE);
break;
case UBCMTP_TYPE4:
sc->tp_maxlen = UBCMTP_TYPE4_TPLEN;
sc->tp_offset = UBCMTP_TYPE4_TPOFF;
- sc->tp_ifacenum = UBCMTP_TYPE4_TPIFACE;
+ sc->sc_tp_iface = uaa->ifaces[UBCMTP_TYPE4_TPIFACE];
+ usbd_claim_iface(sc->sc_udev, UBCMTP_TYPE4_TPIFACE);
break;
}
@@ -708,12 +717,6 @@ ubcmtp_setup_pipes(struct ubcmtp_softc *sc)
if (sc->dev_type->type == UBCMTP_TYPE1) {
/* setup physical button pipe */
- if ((err = usbd_device2interface_handle(sc->sc_udev,
- sc->bt_ifacenum, &sc->sc_bt_iface)) != 0) {
- printf("%s: failed getting button interface\n",
- sc->sc_dev.dv_xname);
- goto fail1;
- }
ed = usbd_interface2endpoint_descriptor(sc->sc_bt_iface, 0);
if (ed == NULL) {
printf("%s: failed getting button endpoint descriptor\n",
@@ -740,12 +743,6 @@ ubcmtp_setup_pipes(struct ubcmtp_softc *sc)
/* setup trackpad data pipe */
- if ((err = usbd_device2interface_handle(sc->sc_udev, sc->tp_ifacenum,
- &sc->sc_tp_iface)) != 0) {
- printf("%s: failed getting trackpad data interface\n",
- sc->sc_dev.dv_xname);
- goto fail2;
- }
ed = usbd_interface2endpoint_descriptor(sc->sc_tp_iface, 0);
if (ed == NULL) {
printf("%s: failed getting trackpad data endpoint descriptor\n",