Module Name:    src
Committed By:   jdolecek
Date:           Sun Feb 10 19:23:55 UTC 2019

Modified Files:
        src/sys/dev/usb: umass.c umass_isdata.c umass_scsipi.c umass_scsipi.h

Log Message:
move the deallocation of the protocol-specific softc into its own detach hook,
so that calls to kmem_alloc() and kmem_free() would agree on the size

fixes panic on umass detach reported by Tom Ivar Helbekkmo on current-users@


To generate a diff of this commit:
cvs rdiff -u -r1.173 -r1.174 src/sys/dev/usb/umass.c
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/usb/umass_isdata.c
cvs rdiff -u -r1.59 -r1.60 src/sys/dev/usb/umass_scsipi.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/usb/umass_scsipi.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/umass.c
diff -u src/sys/dev/usb/umass.c:1.173 src/sys/dev/usb/umass.c:1.174
--- src/sys/dev/usb/umass.c:1.173	Thu Feb  7 13:48:27 2019
+++ src/sys/dev/usb/umass.c	Sun Feb 10 19:23:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass.c,v 1.173 2019/02/07 13:48:27 skrll Exp $	*/
+/*	$NetBSD: umass.c,v 1.174 2019/02/10 19:23:55 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -124,7 +124,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.173 2019/02/07 13:48:27 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.174 2019/02/10 19:23:55 jdolecek Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -828,6 +828,24 @@ umass_detach(device_t self, int flags)
 			rv = config_detach(scbus->sc_child, flags);
 
 		switch (sc->sc_cmd) {
+		case UMASS_CPROTO_RBC:
+		case UMASS_CPROTO_SCSI:
+#if NSCSIBUS > 0
+			umass_scsi_detach(sc);
+#else
+			aprint_error_dev(self, "scsibus not configured\n");
+#endif
+			break;
+
+		case UMASS_CPROTO_UFI:
+		case UMASS_CPROTO_ATAPI:
+#if NATAPIBUS > 0
+			umass_atapi_detach(sc);
+#else
+			aprint_error_dev(self, "atapibus not configured\n");
+#endif
+			break;
+
 		case UMASS_CPROTO_ISD_ATA:
 #if NWD > 0
 			umass_isdata_detach(sc);
@@ -841,8 +859,8 @@ umass_detach(device_t self, int flags)
 			break;
 		}
 
-		kmem_free(scbus, sizeof(*scbus));
-		sc->bus = NULL;
+		/* protocol detach is expected to free sc->bus */
+		KASSERT(sc->bus == NULL);
 	}
 
 	if (rv != 0)

Index: src/sys/dev/usb/umass_isdata.c
diff -u src/sys/dev/usb/umass_isdata.c:1.41 src/sys/dev/usb/umass_isdata.c:1.42
--- src/sys/dev/usb/umass_isdata.c:1.41	Thu Feb  7 13:48:27 2019
+++ src/sys/dev/usb/umass_isdata.c	Sun Feb 10 19:23:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass_isdata.c,v 1.41 2019/02/07 13:48:27 skrll Exp $	*/
+/*	$NetBSD: umass_isdata.c,v 1.42 2019/02/10 19:23:55 jdolecek Exp $	*/
 
 /*
  * TODO:
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umass_isdata.c,v 1.41 2019/02/07 13:48:27 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umass_isdata.c,v 1.42 2019/02/10 19:23:55 jdolecek Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -244,6 +244,9 @@ umass_isdata_detach(struct umass_softc *
 	struct uisdata_softc *scbus = (struct uisdata_softc *)sc->bus;
 
 	ata_channel_destroy(&scbus->sc_channel);
+
+	kmem_free(scbus, sizeof(*scbus));
+	sc->bus = NULL;
 }
 
 void

Index: src/sys/dev/usb/umass_scsipi.c
diff -u src/sys/dev/usb/umass_scsipi.c:1.59 src/sys/dev/usb/umass_scsipi.c:1.60
--- src/sys/dev/usb/umass_scsipi.c:1.59	Thu Feb  7 13:48:27 2019
+++ src/sys/dev/usb/umass_scsipi.c	Sun Feb 10 19:23:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass_scsipi.c,v 1.59 2019/02/07 13:48:27 skrll Exp $	*/
+/*	$NetBSD: umass_scsipi.c,v 1.60 2019/02/10 19:23:55 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 2001, 2003, 2012 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umass_scsipi.c,v 1.59 2019/02/07 13:48:27 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umass_scsipi.c,v 1.60 2019/02/10 19:23:55 jdolecek Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -151,6 +151,15 @@ umass_scsi_attach(struct umass_softc *sc
 
 	return 0;
 }
+
+void
+umass_scsi_detach(struct umass_softc *sc)
+{
+	struct umass_scsipi_softc *scbus = (struct umass_scsipi_softc *)sc->bus;
+
+	kmem_free(scbus, sizeof(*scbus));
+	sc->bus = NULL;
+}
 #endif
 
 #if NATAPIBUS > 0
@@ -183,6 +192,15 @@ umass_atapi_attach(struct umass_softc *s
 
 	return 0;
 }
+
+void
+umass_atapi_detach(struct umass_softc *sc)
+{
+	struct umass_scsipi_softc *scbus = (struct umass_scsipi_softc *)sc->bus;
+
+	kmem_free(scbus, sizeof(*scbus));
+	sc->bus = NULL;
+}
 #endif
 
 Static struct umass_scsipi_softc *

Index: src/sys/dev/usb/umass_scsipi.h
diff -u src/sys/dev/usb/umass_scsipi.h:1.3 src/sys/dev/usb/umass_scsipi.h:1.4
--- src/sys/dev/usb/umass_scsipi.h:1.3	Sat Apr 23 10:15:32 2016
+++ src/sys/dev/usb/umass_scsipi.h	Sun Feb 10 19:23:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass_scsipi.h,v 1.3 2016/04/23 10:15:32 skrll Exp $	*/
+/*	$NetBSD: umass_scsipi.h,v 1.4 2019/02/10 19:23:55 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -31,4 +31,7 @@
  */
 
 int umass_scsi_attach(struct umass_softc *);
+void umass_scsi_detach(struct umass_softc *);
+
 int umass_atapi_attach(struct umass_softc *);
+void umass_atapi_detach(struct umass_softc *);

Reply via email to