mirror of https://gitee.com/openkylin/linux.git
Fixed oops if an uninitialized key is used for encryption.
Without this patch, if you try and use a key that has not been configured, for example: % iwconfig eth1 key deadbeef00 [2] without having configured key [1], then the active key will still be [1], but privacy will now be enabled. Transmission of a packet in this situation will result in a kernel oops. Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
This commit is contained in:
parent
5b74eda78d
commit
f0f15ab554
|
@ -157,11 +157,14 @@ static inline int ieee80211_encrypt_fragment(struct ieee80211_device *ieee,
|
||||||
struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx];
|
struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx];
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
if (crypt == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* To encrypt, frame format is:
|
/* To encrypt, frame format is:
|
||||||
* IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
|
* IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
|
||||||
atomic_inc(&crypt->refcnt);
|
atomic_inc(&crypt->refcnt);
|
||||||
res = 0;
|
res = 0;
|
||||||
if (crypt->ops->encrypt_mpdu)
|
if (crypt->ops && crypt->ops->encrypt_mpdu)
|
||||||
res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
|
res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
|
||||||
|
|
||||||
atomic_dec(&crypt->refcnt);
|
atomic_dec(&crypt->refcnt);
|
||||||
|
@ -264,9 +267,9 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
|
encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
|
||||||
ieee->sec.encrypt;
|
ieee->sec.encrypt;
|
||||||
|
|
||||||
host_encrypt = ieee->host_encrypt && encrypt;
|
host_encrypt = ieee->host_encrypt && encrypt && crypt;
|
||||||
host_encrypt_msdu = ieee->host_encrypt_msdu && encrypt;
|
host_encrypt_msdu = ieee->host_encrypt_msdu && encrypt && crypt;
|
||||||
host_build_iv = ieee->host_build_iv && encrypt;
|
host_build_iv = ieee->host_build_iv && encrypt && crypt;
|
||||||
|
|
||||||
if (!encrypt && ieee->ieee802_1x &&
|
if (!encrypt && ieee->ieee802_1x &&
|
||||||
ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
|
ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
|
||||||
|
|
Loading…
Reference in New Issue