diff options
author | 2019-01-13 14:30:16 +0000 | |
---|---|---|
committer | 2019-01-13 14:30:16 +0000 | |
commit | 2bdc593d57756e20b55f5abf2c59a074ed26d46d (patch) | |
tree | 3f8762a7678bcd65dc96e9e8fa7959425804e758 | |
parent | Validate that the interface passed to *match() is the expected one (diff) | |
download | wireguard-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.c | 37 |
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", |