fixes panic on attach/detach due to free list corruption, also use
after usbd_free_xfer(), tested on i386
~~~
Index: uow.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uow.c,v
retrieving revision 1.33
diff -u -p -s -r1.33 uow.c
--- uow.c 15 Apr 2013 09:23:02 -0000 1.33
+++ uow.c 29 Aug 2015 20:06:02 -0000
@@ -226,8 +226,10 @@ fail:
usbd_close_pipe(sc->sc_ph_obulk);
if (sc->sc_ph_intr != NULL)
usbd_close_pipe(sc->sc_ph_intr);
- if (sc->sc_xfer != NULL)
+ if (sc->sc_xfer != NULL) {
usbd_free_xfer(sc->sc_xfer);
+ sc->sc_xfer = NULL;
+ }
}
int
@@ -251,8 +253,10 @@ uow_detach(struct device *self, int flag
usbd_close_pipe(sc->sc_ph_intr);
}
- if (sc->sc_xfer != NULL)
+ if (sc->sc_xfer != NULL) {
usbd_free_xfer(sc->sc_xfer);
+ sc->sc_xfer = NULL;
+ }
if (sc->sc_ow_dev != NULL)
rv = config_detach(sc->sc_ow_dev, flags);
@@ -464,15 +468,18 @@ uow_read(struct uow_softc *sc, void *buf
usbd_setup_xfer(sc->sc_xfer, sc->sc_ph_ibulk, sc, buf, len,
USBD_SHORT_XFER_OK | USBD_SYNCHRONOUS, UOW_TIMEOUT, NULL);
error = usbd_transfer(sc->sc_xfer);
- usbd_free_xfer(sc->sc_xfer);
if (error != 0) {
printf("%s: read failed, len %d: %s\n",
sc->sc_dev.dv_xname, len, usbd_errstr(error));
uow_reset(sc);
+ usbd_free_xfer(sc->sc_xfer);
+ sc->sc_xfer = NULL;
return (-1);
}
usbd_get_xfer_status(sc->sc_xfer, NULL, NULL, &count, &error);
+ usbd_free_xfer(sc->sc_xfer);
+ sc->sc_xfer = NULL;
return (count);
}
@@ -496,6 +503,7 @@ uow_write(struct uow_softc *sc, const vo
USBD_SYNCHRONOUS, UOW_TIMEOUT, NULL);
error = usbd_transfer(sc->sc_xfer);
usbd_free_xfer(sc->sc_xfer);
+ sc->sc_xfer = NULL;
if (error != 0) {
printf("%s: write failed, len %d: %s\n",
sc->sc_dev.dv_xname, len, usbd_errstr(error));