da(4): defend against calling sysctl_ctx_free on unininitalized sysctl_ctx

Thomas Quinot thomas at FreeBSD.ORG
Tue Oct 7 08:29:26 PDT 2003


The following change resolves a recently observed panic on probe of
various USB mass storage devices. It is similar to the one I committed
in scsi_cd.c rev 1.86. Please review!

Thanks,
Thomas.

Index: scsi_da.c
===================================================================
RCS file: /home/ncvs/src/sys/cam/scsi/scsi_da.c,v
retrieving revision 1.159
diff -u -r1.159 scsi_da.c
--- scsi_da.c	4 Sep 2003 01:01:20 -0000	1.159
+++ scsi_da.c	7 Oct 2003 14:48:26 -0000
@@ -89,7 +89,8 @@
 	DA_FLAG_NEED_OTAG	= 0x020,
 	DA_FLAG_WENT_IDLE	= 0x040,
 	DA_FLAG_RETRY_UA	= 0x080,
-	DA_FLAG_OPEN		= 0x100
+	DA_FLAG_OPEN		= 0x100,
+	DA_FLAG_SCTX_INIT	= 0x200
 } da_flags;
 
 typedef enum {
@@ -838,7 +839,8 @@
 	/*
 	 * If we can't free the sysctl tree, oh well...
 	 */
-	if (sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
+	if ((softc->flags & DA_FLAG_SCTX_INIT) != 0
+	    && sysctl_ctx_free(&softc->sysctl_ctx) != 0) {
 		xpt_print_path(periph->path);
 		printf("can't remove sysctl context\n");
 	}
@@ -925,6 +927,7 @@
 
 	mtx_lock(&Giant);
 	sysctl_ctx_init(&softc->sysctl_ctx);
+	softc->flags |= DA_FLAG_SCTX_INIT;
 	softc->sysctl_tree = SYSCTL_ADD_NODE(&softc->sysctl_ctx,
 		SYSCTL_STATIC_CHILDREN(_kern_cam_da), OID_AUTO, tmpstr2,
 		CTLFLAG_RD, 0, tmpstr);

-- 
    Thomas.Quinot at Cuivre.FR.EU.ORG
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-scsi/attachments/20031007/364d808e/attachment.bin


More information about the freebsd-scsi mailing list