]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Feb 2014 19:34:10 +0000 (11:34 -0800)
commit 3c60cfd73966797746530768d66597d025a69804 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/qla4xxx/ql4_os.c

index a28d5e624aabcdd729e4c64c4c904549e21d6e17..cf174a4ffa84d0ac460d97840e6f1cdf24fdfb78 100644 (file)
@@ -802,6 +802,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));
 
@@ -816,12 +817,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];