summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2017-03-29 15:41:14 +0000
committermav <mav@FreeBSD.org>2017-03-29 15:41:14 +0000
commit3c1b58246877e619b84f0699a012a0f7798676c7 (patch)
tree7acfe65eded21db9b218815a6d0845b553b8c997
parent98e480798f1e9f191dce388b237ea1122a6be914 (diff)
downloadFreeBSD-src-3c1b58246877e619b84f0699a012a0f7798676c7.zip
FreeBSD-src-3c1b58246877e619b84f0699a012a0f7798676c7.tar.gz
MFC r315303: Fix panic when SIM dereferenced before allocation.
-rw-r--r--sys/dev/isp/isp_freebsd.c49
1 files changed, 25 insertions, 24 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 3b6301f..53e2363 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -362,39 +362,40 @@ isp_detach(ispsoftc_t *isp)
static void
isp_freeze_loopdown(ispsoftc_t *isp, int chan)
{
- if (IS_FC(isp)) {
- struct isp_fc *fc = ISP_FC_PC(isp, chan);
- if (fc->simqfrozen == 0) {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Freeze simq (loopdown)", chan);
- fc->simqfrozen = SIMQFRZ_LOOPDOWN;
- xpt_hold_boot();
- xpt_freeze_simq(fc->sim, 1);
- } else {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Mark simq frozen (loopdown)", chan);
- fc->simqfrozen |= SIMQFRZ_LOOPDOWN;
- }
+ struct isp_fc *fc = ISP_FC_PC(isp, chan);
+
+ if (fc->sim == NULL)
+ return;
+ if (fc->simqfrozen == 0) {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Freeze simq (loopdown)", chan);
+ fc->simqfrozen = SIMQFRZ_LOOPDOWN;
+ xpt_hold_boot();
+ xpt_freeze_simq(fc->sim, 1);
+ } else {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Mark simq frozen (loopdown)", chan);
+ fc->simqfrozen |= SIMQFRZ_LOOPDOWN;
}
}
static void
isp_unfreeze_loopdown(ispsoftc_t *isp, int chan)
{
- if (IS_FC(isp)) {
- struct isp_fc *fc = ISP_FC_PC(isp, chan);
- int wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN;
- fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN;
- if (wasfrozen && fc->simqfrozen == 0) {
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d Release simq", chan);
- xpt_release_simq(fc->sim, 1);
- xpt_release_boot();
- }
+ struct isp_fc *fc = ISP_FC_PC(isp, chan);
+
+ if (fc->sim == NULL)
+ return;
+ int wasfrozen = fc->simqfrozen & SIMQFRZ_LOOPDOWN;
+ fc->simqfrozen &= ~SIMQFRZ_LOOPDOWN;
+ if (wasfrozen && fc->simqfrozen == 0) {
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Chan %d Release simq", chan);
+ xpt_release_simq(fc->sim, 1);
+ xpt_release_boot();
}
}
-
static int
ispioctl(struct cdev *dev, u_long c, caddr_t addr, int flags, struct thread *td)
{
OpenPOWER on IntegriCloud