diff mbox series

mpt3sas: add NULL check in _base_fault_reset_work()

Message ID 20211019191208.6546-1-svens@stackframe.org (mailing list archive)
State New, archived
Headers show
Series mpt3sas: add NULL check in _base_fault_reset_work() | expand

Commit Message

Sven Schnelle Oct. 19, 2021, 7:12 p.m. UTC
My HP C8000 (an PA-RISC based system) crashed with an HPMC. That
triggered the HPMC handler in the kernel, and i got a crash in
_base_fault_reset_work() from mpt3sas. It looks like this function
calls ioc->schedule_dead_ioc_flush_running_cmds() without checking
whether there's actually a function set, so it dereferences a NULL
pointer on that system. The c8000 actually uses the mptspi driver
instead of mpt3sas which doesn't seem to set this handler.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
---
Disclaimer: I have no idea about the inner workings of the MPT Fusion drivers.
So this might be completely wrong.

 drivers/message/fusion/mptbase.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Martin K. Petersen Oct. 21, 2021, 3:08 a.m. UTC | #1
Sven,

> My HP C8000 (an PA-RISC based system) crashed with an HPMC. That
> triggered the HPMC handler in the kernel, and i got a crash in
> _base_fault_reset_work() from mpt3sas. It looks like this function
> calls ioc->schedule_dead_ioc_flush_running_cmds() without checking
> whether there's actually a function set, so it dereferences a NULL
> pointer on that system. The c8000 actually uses the mptspi driver
> instead of mpt3sas which doesn't seem to set this handler.

I'm not sure how you end up in the mpt3sas driver if your system uses
mptspi!?

Can you please send us the HPMC and the output of lspci?

Thanks!
Sven Schnelle Oct. 21, 2021, 5:40 a.m. UTC | #2
Hi Martin,

"Martin K. Petersen" <martin.petersen@oracle.com> writes:

>> My HP C8000 (an PA-RISC based system) crashed with an HPMC. That
>> triggered the HPMC handler in the kernel, and i got a crash in
>> _base_fault_reset_work() from mpt3sas. It looks like this function
>> calls ioc->schedule_dead_ioc_flush_running_cmds() without checking
>> whether there's actually a function set, so it dereferences a NULL
>> pointer on that system. The c8000 actually uses the mptspi driver
>> instead of mpt3sas which doesn't seem to set this handler.
>
> I'm not sure how you end up in the mpt3sas driver if your system uses
> mptspi!?
>
> Can you please send us the HPMC and the output of lspci?

It doesn't end up in mpt3sas, i was just confused because
schedule_dead_ioc_flush_running_cmds() exist also there. If you look at
the diff, you see that i patched the mptspi driver. So the description
is just wrong, sorry.

I'll try to see whether i can reproduce it once more, but the question
still is whether the if () check is okay, or whether that needs more
work (i.e., a handler for that)

Regards
Sven
diff mbox series

Patch

diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c
index 7f7abc9069f7..38f5aa43b457 100644
--- a/drivers/message/fusion/mptbase.c
+++ b/drivers/message/fusion/mptbase.c
@@ -381,7 +381,8 @@  mpt_fault_reset_work(struct work_struct *work)
 		 * since dead ioc will never return any command back from HW.
 		 */
 		hd = shost_priv(ioc->sh);
-		ioc->schedule_dead_ioc_flush_running_cmds(hd);
+		if (ioc->schedule_dead_ioc_flush_running_cmds)
+			ioc->schedule_dead_ioc_flush_running_cmds(hd);
 
 		/*Remove the Dead Host */
 		p = kthread_run(mpt_remove_dead_ioc_func, ioc,