[SCSI] aacraid: check buffer address in aac_internal_transfer
authorSalyzyn, Mark <mark_salyzyn@adaptec.com>
Wed, 21 Mar 2007 17:22:56 +0000 (13:22 -0400)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Wed, 21 Mar 2007 17:45:15 +0000 (11:45 -0600)
Captured a panic on an older kernel where an application issuing
commands via sg was sending requests that lacked a request_buffer, thus
the buffer pointer used in aac_internal_transer was NULL. The
application was fixed closing the issue, but felt it was advised to
immunize the driver against the eventuality.

Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/aacraid/aachba.c

index 0c4e27eb65201cb082884bbe7347fdea20870964..f9deab686dc488dc6f9ca27e690036268a9088ce 100644 (file)
@@ -350,8 +350,9 @@ static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigne
                buf = scsicmd->request_buffer;
                transfer_len = min(scsicmd->request_bufflen, len + offset);
        }
-
-       memcpy(buf + offset, data, transfer_len - offset);
+       transfer_len -= offset;
+       if (buf && transfer_len)
+               memcpy(buf + offset, data, transfer_len);
 
        if (scsicmd->use_sg) 
                kunmap_atomic(buf - sg->offset, KM_IRQ0);