Skip to content

Commit d451b50

Browse files
jmalinengregkh
authored andcommitted
mac80211: Do not use stack memory with scatterlist for GMAC
commit a71fd9d upstream. ieee80211_aes_gmac() uses the mic argument directly in sg_set_buf() and that does not allow use of stack memory (e.g., BUG_ON() is hit in sg_set_buf() with CONFIG_DEBUG_SG). BIP GMAC TX side is fine for this since it can use the skb data buffer, but the RX side was using a stack variable for deriving the local MIC value to compare against the received one. Fix this by allocating heap memory for the mic buffer. This was found with hwsim test case ap_cipher_bip_gmac_128 hitting that BUG_ON() and kernel panic. Cc: stable@vger.kernel.org Signed-off-by: Jouni Malinen <j@w1.fi> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 72dc678 commit d451b50

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

net/mac80211/wpa.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
11751175
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
11761176
struct ieee80211_key *key = rx->key;
11771177
struct ieee80211_mmie_16 *mmie;
1178-
u8 aad[GMAC_AAD_LEN], mic[GMAC_MIC_LEN], ipn[6], nonce[GMAC_NONCE_LEN];
1178+
u8 aad[GMAC_AAD_LEN], *mic, ipn[6], nonce[GMAC_NONCE_LEN];
11791179
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
11801180

11811181
if (!ieee80211_is_mgmt(hdr->frame_control))
@@ -1206,13 +1206,18 @@ ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx)
12061206
memcpy(nonce, hdr->addr2, ETH_ALEN);
12071207
memcpy(nonce + ETH_ALEN, ipn, 6);
12081208

1209+
mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC);
1210+
if (!mic)
1211+
return RX_DROP_UNUSABLE;
12091212
if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
12101213
skb->data + 24, skb->len - 24,
12111214
mic) < 0 ||
12121215
crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) {
12131216
key->u.aes_gmac.icverrors++;
1217+
kfree(mic);
12141218
return RX_DROP_UNUSABLE;
12151219
}
1220+
kfree(mic);
12161221
}
12171222

12181223
memcpy(key->u.aes_gmac.rx_pn, ipn, 6);

0 commit comments

Comments
 (0)