aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@oracle.com>2016-09-15 09:44:56 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2016-09-15 09:58:25 -0400
commit7bc2b55a5c030685b399bb65b6baa9ccc3d1f167 (patch)
treee075d49871cb515e0d967fb11c39440309ae8d8e
parent38247feb60512a52c4f847933f8f931284dc21f4 (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.c8
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);