Make sure to call uhidev_close() upon detach for every HID driver calling
authormpi <mpi@openbsd.org>
Wed, 7 May 2014 08:17:21 +0000 (08:17 +0000)
committermpi <mpi@openbsd.org>
Wed, 7 May 2014 08:17:21 +0000 (08:17 +0000)
uhidev_open() at attach time.  This plugs up to 3 xfer leaks and a buffer
one.

ok yuo@

sys/dev/usb/ucycom.c
sys/dev/usb/uoaklux.c
sys/dev/usb/uoakrh.c
sys/dev/usb/uoakv.c
sys/dev/usb/utrh.c
sys/dev/usb/utwitch.c

index 10ee32d..ca2beeb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ucycom.c,v 1.26 2014/04/15 09:14:27 mpi Exp $ */
+/*     $OpenBSD: ucycom.c,v 1.27 2014/05/07 08:17:21 mpi Exp $ */
 /*     $NetBSD: ucycom.c,v 1.3 2005/08/05 07:27:47 skrll Exp $ */
 
 /*
@@ -582,6 +582,10 @@ ucycom_detach(struct device *self, int flags)
                config_detach(sc->sc_subdev, flags);
                sc->sc_subdev = NULL;
        }
+
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        return (0);
 }
 
index ad0761b..9a3b240 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uoaklux.c,v 1.7 2014/03/19 08:59:37 mpi Exp $   */
+/*     $OpenBSD: uoaklux.c,v 1.8 2014/05/07 08:17:21 mpi Exp $   */
 
 /*
  * Copyright (c) 2012 Yojiro UO <yuo@nui.org>
@@ -208,6 +208,9 @@ uoaklux_detach(struct device *self, int flags)
        if (sc->sc_sensortask != NULL)
                sensor_task_unregister(sc->sc_sensortask);
 
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        if (scc->sc_ibuf != NULL) {
                free(scc->sc_ibuf, M_USBDEV);
                scc->sc_ibuf = NULL;
index 580fe30..0540e2d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uoakrh.c,v 1.8 2014/03/19 08:59:37 mpi Exp $   */
+/*     $OpenBSD: uoakrh.c,v 1.9 2014/05/07 08:17:21 mpi Exp $   */
 
 /*
  * Copyright (c) 2012 Yojiro UO <yuo@nui.org>
@@ -224,6 +224,9 @@ uoakrh_detach(struct device *self, int flags)
        if (sc->sc_sensortask != NULL)
                sensor_task_unregister(sc->sc_sensortask);
 
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        if (scc->sc_ibuf != NULL) {
                free(scc->sc_ibuf, M_USBDEV);
                scc->sc_ibuf = NULL;
index aaa43f6..40093d5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uoakv.c,v 1.7 2014/03/19 08:59:37 mpi Exp $   */
+/*     $OpenBSD: uoakv.c,v 1.8 2014/05/07 08:17:21 mpi Exp $   */
 
 /*
  * Copyright (c) 2012 Yojiro UO <yuo@nui.org>
@@ -212,6 +212,9 @@ uoakv_detach(struct device *self, int flags)
        if (sc->sc_sensortask != NULL)
                sensor_task_unregister(sc->sc_sensortask);
 
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        if (scc->sc_ibuf != NULL) {
                free(scc->sc_ibuf, M_USBDEV);
                scc->sc_ibuf = NULL;
index 17eb6a8..451734d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: utrh.c,v 1.14 2014/04/15 09:14:27 mpi Exp $   */
+/*     $OpenBSD: utrh.c,v 1.15 2014/05/07 08:17:21 mpi Exp $   */
 
 /*
  * Copyright (c) 2009 Yojiro UO <yuo@nui.org>
@@ -175,6 +175,9 @@ utrh_detach(struct device *self, int flags)
                        sensor_task_unregister(sc->sc_sensortask);
        }
 
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        if (sc->sc_ibuf != NULL) {
                free(sc->sc_ibuf, M_USBDEV);
                sc->sc_ibuf = NULL;
index 69dd635..2f7c0c0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: utwitch.c,v 1.11 2014/04/15 09:14:27 mpi Exp $ */
+/*     $OpenBSD: utwitch.c,v 1.12 2014/05/07 08:17:21 mpi Exp $ */
 
 /*
  * Copyright (c) 2010 Yojiro UO <yuo@nui.org>
@@ -189,6 +189,9 @@ utwitch_detach(struct device *self, int flags)
        if (sc->sc_sensortask != NULL)
                sensor_task_unregister(sc->sc_sensortask);
 
+       if (sc->sc_hdev.sc_state & UHIDEV_OPEN)
+               uhidev_close(&sc->sc_hdev);
+
        if (sc->sc_ibuf != NULL) {
                free(sc->sc_ibuf, M_USBDEV);
                sc->sc_ibuf = NULL;