Module Name:    src
Committed By:   christos
Date:           Thu Apr 17 15:55:53 UTC 2014

Modified Files:
        src/sys/dev/ic: mpt_netbsd.c

Log Message:
CID 1203189: Null deref.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/ic/mpt_netbsd.c

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/ic/mpt_netbsd.c
diff -u src/sys/dev/ic/mpt_netbsd.c:1.22 src/sys/dev/ic/mpt_netbsd.c:1.23
--- src/sys/dev/ic/mpt_netbsd.c:1.22	Tue Apr 15 01:27:54 2014
+++ src/sys/dev/ic/mpt_netbsd.c	Thu Apr 17 11:55:53 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpt_netbsd.c,v 1.22 2014/04/15 05:27:54 buhrow Exp $	*/
+/*	$NetBSD: mpt_netbsd.c,v 1.23 2014/04/17 15:55:53 christos Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpt_netbsd.c,v 1.22 2014/04/15 05:27:54 buhrow Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpt_netbsd.c,v 1.23 2014/04/17 15:55:53 christos Exp $");
 
 #include <dev/ic/mpt.h>			/* pulls in all headers */
 #include <sys/scsiio.h>
@@ -540,13 +540,15 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 		if (mpt_reply != NULL)
 			mpt_ctlop(mpt, mpt_reply, reply);
 		else
-			mpt_prt(mpt, "mpt_done: index 0x%x, NULL reply", index);
+			mpt_prt(mpt, "%s: index 0x%x, NULL reply", __func__,
+			    index);
 		return;
 	}
 
 	/* Did we end up with a valid index into the table? */
 	if (__predict_false(index < 0 || index >= MPT_MAX_REQUESTS(mpt))) {
-		mpt_prt(mpt, "mpt_done: invalid index (0x%x) in reply", index);
+		mpt_prt(mpt, "%s: invalid index (0x%x) in reply", __func__,
+		    index);
 		return;
 	}
 
@@ -554,7 +556,8 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 
 	/* Make sure memory hasn't been trashed. */
 	if (__predict_false(req->index != index)) {
-		mpt_prt(mpt, "mpt_done: corrupted request_t (0x%x)", index);
+		mpt_prt(mpt, "%s: corrupted request_t (0x%x)", __func__,
+		    index);
 		return;
 	}
 
@@ -564,7 +567,7 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	/* Short cut for task management replies; nothing more for us to do. */
 	if (__predict_false(mpt_req->Function == MPI_FUNCTION_SCSI_TASK_MGMT)) {
 		if (mpt->verbose > 1)
-			mpt_prt(mpt, "mpt_done: TASK MGMT");
+			mpt_prt(mpt, "%s: TASK MGMT", __func__);
 		KASSERT(req == mpt->mngt_req);
 		mpt->mngt_req = NULL;
 		goto done;
@@ -580,8 +583,8 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	if (__predict_false(mpt_req->Function !=
 			    MPI_FUNCTION_SCSI_IO_REQUEST)) {
 		if (mpt->verbose > 1)
-			mpt_prt(mpt, "mpt_done: unknown Function 0x%x (0x%x)",
-			    mpt_req->Function, index);
+			mpt_prt(mpt, "%s: unknown Function 0x%x (0x%x)",
+			    __func__, mpt_req->Function, index);
 		goto done;
 	}
 
@@ -591,7 +594,7 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	/* Can't have a SCSI command without a scsipi_xfer. */
 	if (__predict_false(xs == NULL)) {
 		mpt_prt(mpt,
-		    "mpt_done: no scsipi_xfer, index = 0x%x, seq = 0x%08x",
+		    "%s: no scsipi_xfer, index = 0x%x, seq = 0x%08x", __func__,
 		    req->index, req->sequence);
 		mpt_prt(mpt, "request state: %s", mpt_req_state(req->debug));
 		mpt_prt(mpt, "mpt_request:");
@@ -646,7 +649,7 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	switch (le16toh(mpt_reply->IOCStatus) & MPI_IOCSTATUS_MASK) {
 	case MPI_IOCSTATUS_SCSI_DATA_OVERRUN:
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC overrun!");
+		mpt_prt(mpt, "%s: IOC overrun!", __func__);
 		break;
 
 	case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:
@@ -705,34 +708,34 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 
 	case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC SCSI residual mismatch!");
+		mpt_prt(mpt, "%s: IOC SCSI residual mismatch!", __func__);
 		restart = 1;
 		break;
 
 	case MPI_IOCSTATUS_SCSI_TASK_TERMINATED:
 		/* XXX What should we do here? */
-		mpt_prt(mpt,"mpt_done: IOC SCSI task terminated!");
+		mpt_prt(mpt, "%s: IOC SCSI task terminated!", __func__);
 		restart = 1;
 		break;
 
 	case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
 		/* XXX */
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC SCSI task failed!");
+		mpt_prt(mpt, "%s: IOC SCSI task failed!", __func__);
 		restart = 1;
 		break;
 
 	case MPI_IOCSTATUS_SCSI_IOC_TERMINATED:
 		/* XXX */
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC task terminated!");
+		mpt_prt(mpt, "%s: IOC task terminated!", __func__);
 		restart = 1;
 		break;
 
 	case MPI_IOCSTATUS_SCSI_EXT_TERMINATED:
 		/* XXX This is a bus-reset */
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC SCSI bus reset!");
+		mpt_prt(mpt, "%s: IOC SCSI bus reset!", __func__);
 		restart = 1;
 		break;
 
@@ -740,10 +743,12 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 		/*
 		 * FreeBSD and Linux indicate this is a phase error between
 		 * the IOC and the drive itself. When this happens, the IOC
-		* becomes unhappy and stops processing all transactions.  
-		* Call mpt_timeout which knows how to get the IOC back on its feet.
+		 * becomes unhappy and stops processing all transactions.  
+		 * Call mpt_timeout which knows how to get the IOC back
+		 * on its feet.
 		 */
-		 mpt_prt(mpt,"mpt_done: IOC indicates protocol error -- recovering...");
+		 mpt_prt(mpt, "%s: IOC indicates protocol error -- "
+		     "recovering...", __func__);
 		xs->error = XS_TIMEOUT;
 		restart = 1;
 
@@ -752,7 +757,8 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	default:
 		/* XXX unrecognized HBA error */
 		xs->error = XS_DRIVER_STUFFUP;
-		mpt_prt(mpt,"mpt_done: IOC returned unknown code: 0x%x",le16toh(mpt_reply->IOCStatus));
+		mpt_prt(mpt, "%s: IOC returned unknown code: 0x%x", __func__,
+		    le16toh(mpt_reply->IOCStatus));
 		restart = 1;
 		break;
 	}
@@ -770,9 +776,9 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 	}
 
  done:
-	if (le16toh(mpt_reply->IOCStatus) & 
+	if (mpt_reply != NULL && le16toh(mpt_reply->IOCStatus) & 
 	MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
-		mpt_prt(mpt,"mpt_done: IOC has error - logging...\n");
+		mpt_prt(mpt, "%s: IOC has error - logging...\n", __func__);
 		mpt_ctlop(mpt, mpt_reply, reply);
 	}
 
@@ -788,7 +794,7 @@ mpt_done(mpt_softc_t *mpt, uint32_t repl
 		scsipi_done(xs);
 
 	if (restart) {
-		mpt_prt(mpt,"mpt_done: IOC fatal error: restarting...");
+		mpt_prt(mpt, "%s: IOC fatal error: restarting...", __func__);
 		mpt_restart(mpt, NULL);
 	}
 }
@@ -1065,7 +1071,7 @@ mpt_run_xfer(mpt_softc_t *mpt, struct sc
 		mpt_print_scsi_io_request(mpt_req);
 
 		if (xs->timeout == 0) {
-			mpt_prt(mpt,"mpt_run_xfer: no timeout specified for request: 0x%x\n",
+			mpt_prt(mpt, "mpt_run_xfer: no timeout specified for request: 0x%x\n",
 			req->index);
 			xs->timeout = 500;
 		}

Reply via email to