Message ID | 20230531133259.55619-1-mheyne@amazon.de (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | scsi: megaraid: Fix uninitialized mbox in mega_cmd_done | expand |
Hi Maximilian! > This is similar to commit 7a2ae008a53c ("scsi: megaraid: Fix > mega_cmd_done() CMDID_INT_CMDS"). That's supposed to be commit 75cb113cd43f, right? > When cmdid == CMDID_INT_CMDS and status != 0 then mbox is still NULL > but is dereferenced below. Is this actually a valid scenario, though? The mbox is only dereferenced if there is status returned from an attached device. And I am guessing that a controller-internal command does not talk to any attached device. Thus status should always be 0 for CMDID_INT_CMDS. I don't have the megaraid firmware manual so this is pure guesswork on my part. But you would think we would have come across an invalid deref since the original 2014 commit made the offending change.
On Wed, May 31, 2023 at 06:38:12PM -0400, Martin K. Petersen wrote: > Hi Maximilian! Hi Martin, thanks for your response. > > > This is similar to commit 7a2ae008a53c ("scsi: megaraid: Fix > > mega_cmd_done() CMDID_INT_CMDS"). > > That's supposed to be commit 75cb113cd43f, right? Sorry, yes I meant this commit. I accidentally got the commit id form the 5.4 backport. > > > When cmdid == CMDID_INT_CMDS and status != 0 then mbox is still NULL > > but is dereferenced below. > > Is this actually a valid scenario, though? The mbox is only dereferenced > if there is status returned from an attached device. And I am guessing > that a controller-internal command does not talk to any attached device. > Thus status should always be 0 for CMDID_INT_CMDS. I don't have the > megaraid firmware manual so this is pure guesswork on my part. But you > would think we would have come across an invalid deref since the > original 2014 commit made the offending change. > This could indeed be the case. I only found this because it was reported by static code analysis. However, by reading the code it's not obvious that this is how it works. Should we therefore skip the whole status checking switch for internal commands to make it more clear? For example, by a goto to the end of the loop when the scb gets freed or just adding the scb free, list removal and a continue? Amazon Development Center Germany GmbH Krausenstr. 38 10117 Berlin Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B Sitz: Berlin Ust-ID: DE 289 237 879
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index e92f1a73cc9b..4dfe8865a18a 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -1442,6 +1442,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) if (cmdid == CMDID_INT_CMDS) { scb = &adapter->int_scb; cmd = scb->cmd; + mbox = (mbox_t *)scb->raw_mbox; list_del_init(&scb->list); scb->state = SCB_FREE;
This is similar to commit 7a2ae008a53c ("scsi: megaraid: Fix mega_cmd_done() CMDID_INT_CMDS"). When cmdid == CMDID_INT_CMDS and status != 0 then mbox is still NULL but is dereferenced below. This bug was discovered and resolved using Coverity Static Analysis Security Testing (SAST) by Synopsys, Inc. Fixes: 0f2bb84d2a68 ("[SCSI] megaraid: simplify internal command handling") Signed-off-by: Maximilian Heyne <mheyne@amazon.de> --- Note: I have only compile tested this commit. Haven't tried reproducing it. drivers/scsi/megaraid.c | 1 + 1 file changed, 1 insertion(+)