ath10k: add sanity check to ie_len before parsing fw/board ie
authorRyan Hsu <ryanhsu@codeaurora.org>
Tue, 16 Jan 2018 09:43:49 +0000 (11:43 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 16 Jan 2018 14:31:12 +0000 (16:31 +0200)
Validate ie_len after the alignment padding before access the buffer
to avoid potential overflow.

Signed-off-by: Ryan Hsu <ryanhsu@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/core.c

index fe9341c97f319e49cb0a385b22a63d2796702bfa..c60d91328b5fb10a9784c8752a4b5599d677f7aa 100644 (file)
@@ -1276,7 +1276,10 @@ static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar,
                len -= sizeof(*hdr);
                data = hdr->data;
 
-               if (len < ALIGN(ie_len, 4)) {
+               /* jump over the padding */
+               ie_len = ALIGN(ie_len, 4);
+
+               if (len < ie_len) {
                        ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
                                   ie_id, ie_len, len);
                        ret = -EINVAL;
@@ -1315,8 +1318,6 @@ static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar,
                        goto out;
                }
 
-               /* jump over the padding */
-               ie_len = ALIGN(ie_len, 4);
 
                len -= ie_len;
                data += ie_len;
@@ -1448,6 +1449,9 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
                len -= sizeof(*hdr);
                data += sizeof(*hdr);
 
+               /* jump over the padding */
+               ie_len = ALIGN(ie_len, 4);
+
                if (len < ie_len) {
                        ath10k_err(ar, "invalid length for FW IE %d (%zu < %zu)\n",
                                   ie_id, len, ie_len);
@@ -1553,9 +1557,6 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
                        break;
                }
 
-               /* jump over the padding */
-               ie_len = ALIGN(ie_len, 4);
-
                len -= ie_len;
                data += ie_len;
        }