[SCSI] qla4xxx: overflow in qla4xxx_set_chap_entry()
authorDan Carpenter <dan.carpenter@oracle.com>
Wed, 13 Nov 2013 07:48:11 +0000 (10:48 +0300)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 16 Dec 2013 18:57:51 +0000 (10:57 -0800)
We should cap the size of memcpy() because it comes from the network
and can't be trusted.

Fixes: 26ffd7b45fe9 ('[SCSI] qla4xxx: Add support to set CHAP entries')
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla4xxx/ql4_os.c

index b04afaefde84d17a9c23028a22cd6e363bf81196..4706b8c0ec6431dfb7395b70b5a3d5e16b54de80 100644 (file)
@@ -861,6 +861,7 @@ static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, int len)
        int type;
        int rem = len;
        int rc = 0;
+       int size;
 
        memset(&chap_rec, 0, sizeof(chap_rec));
 
@@ -875,12 +876,14 @@ static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, int len)
                        chap_rec.chap_type = param_info->value[0];
                        break;
                case ISCSI_CHAP_PARAM_USERNAME:
-                       memcpy(chap_rec.username, param_info->value,
-                              param_info->len);
+                       size = min_t(size_t, sizeof(chap_rec.username),
+                                    param_info->len);
+                       memcpy(chap_rec.username, param_info->value, size);
                        break;
                case ISCSI_CHAP_PARAM_PASSWORD:
-                       memcpy(chap_rec.password, param_info->value,
-                              param_info->len);
+                       size = min_t(size_t, sizeof(chap_rec.password),
+                                    param_info->len);
+                       memcpy(chap_rec.password, param_info->value, size);
                        break;
                case ISCSI_CHAP_PARAM_PASSWORD_LEN:
                        chap_rec.password_length = param_info->value[0];