diff options
author | Borislav Petkov <bp@alien8.de> | 2016-09-23 07:22:26 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-09-26 21:02:51 -0400 |
commit | 4bd173c30792791a6daca8c64793ec0a4ae8324f (patch) | |
tree | b0f40423e7215222856a7f18e26f58bb5bae8e9a | |
parent | 182d3f84307263e016977eaf23f9048483cf5ea2 (diff) |
scsi: arcmsr: Simplify user_len checking
Do the user_len check first and then the ver_addr allocation so that we
can save us the kfree() on the error path when user_len is >
ARCMSR_API_DATA_BUFLEN.
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Marco Grassi <marco.gra@gmail.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Tomas Henzl <thenzl@redhat.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: <stable@vger.kernel.org>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/arcmsr/arcmsr_hba.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index 110eca9eaca0..3d53d636b17b 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c | |||
@@ -2391,18 +2391,20 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, | |||
2391 | uint32_t user_len; | 2391 | uint32_t user_len; |
2392 | int32_t cnt2end; | 2392 | int32_t cnt2end; |
2393 | uint8_t *pQbuffer, *ptmpuserbuffer; | 2393 | uint8_t *pQbuffer, *ptmpuserbuffer; |
2394 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); | 2394 | |
2395 | if (!ver_addr) { | 2395 | user_len = pcmdmessagefld->cmdmessage.Length; |
2396 | if (user_len > ARCMSR_API_DATA_BUFLEN) { | ||
2396 | retvalue = ARCMSR_MESSAGE_FAIL; | 2397 | retvalue = ARCMSR_MESSAGE_FAIL; |
2397 | goto message_out; | 2398 | goto message_out; |
2398 | } | 2399 | } |
2399 | ptmpuserbuffer = ver_addr; | 2400 | |
2400 | user_len = pcmdmessagefld->cmdmessage.Length; | 2401 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); |
2401 | if (user_len > ARCMSR_API_DATA_BUFLEN) { | 2402 | if (!ver_addr) { |
2402 | retvalue = ARCMSR_MESSAGE_FAIL; | 2403 | retvalue = ARCMSR_MESSAGE_FAIL; |
2403 | kfree(ver_addr); | ||
2404 | goto message_out; | 2404 | goto message_out; |
2405 | } | 2405 | } |
2406 | ptmpuserbuffer = ver_addr; | ||
2407 | |||
2406 | memcpy(ptmpuserbuffer, | 2408 | memcpy(ptmpuserbuffer, |
2407 | pcmdmessagefld->messagedatabuffer, user_len); | 2409 | pcmdmessagefld->messagedatabuffer, user_len); |
2408 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); | 2410 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); |