diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2016-09-15 09:44:56 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-09-15 09:58:25 -0400 |
commit | 7bc2b55a5c030685b399bb65b6baa9ccc3d1f167 (patch) | |
tree | e075d49871cb515e0d967fb11c39440309ae8d8e | |
parent | 38247feb60512a52c4f847933f8f931284dc21f4 (diff) |
scsi: arcmsr: Buffer overflow in arcmsr_iop_message_xfer()
We need to put an upper bound on "user_len" so the memcpy() doesn't
overflow.
Cc: <stable@vger.kernel.org>
Reported-by: Marco Grassi <marco.gra@gmail.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
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 | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index 7640498964a5..110eca9eaca0 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c | |||
@@ -2388,7 +2388,8 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, | |||
2388 | } | 2388 | } |
2389 | case ARCMSR_MESSAGE_WRITE_WQBUFFER: { | 2389 | case ARCMSR_MESSAGE_WRITE_WQBUFFER: { |
2390 | unsigned char *ver_addr; | 2390 | unsigned char *ver_addr; |
2391 | int32_t user_len, cnt2end; | 2391 | uint32_t user_len; |
2392 | int32_t cnt2end; | ||
2392 | uint8_t *pQbuffer, *ptmpuserbuffer; | 2393 | uint8_t *pQbuffer, *ptmpuserbuffer; |
2393 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); | 2394 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); |
2394 | if (!ver_addr) { | 2395 | if (!ver_addr) { |
@@ -2397,6 +2398,11 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, | |||
2397 | } | 2398 | } |
2398 | ptmpuserbuffer = ver_addr; | 2399 | ptmpuserbuffer = ver_addr; |
2399 | user_len = pcmdmessagefld->cmdmessage.Length; | 2400 | user_len = pcmdmessagefld->cmdmessage.Length; |
2401 | if (user_len > ARCMSR_API_DATA_BUFLEN) { | ||
2402 | retvalue = ARCMSR_MESSAGE_FAIL; | ||
2403 | kfree(ver_addr); | ||
2404 | goto message_out; | ||
2405 | } | ||
2400 | memcpy(ptmpuserbuffer, | 2406 | memcpy(ptmpuserbuffer, |
2401 | pcmdmessagefld->messagedatabuffer, user_len); | 2407 | pcmdmessagefld->messagedatabuffer, user_len); |
2402 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); | 2408 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); |