mm, treewide: rename kzfree() to kfree_sensitive()
As said by Linus: A symmetric naming is only helpful if it implies symmetries in use. Otherwise it's actively misleading. In "kzalloc()", the z is meaningful and an important part of what the caller wants. In "kzfree()", the z is actively detrimental, because maybe in the future we really _might_ want to use that "memfill(0xdeadbeef)" or something. The "zero" part of the interface isn't even _relevant_. The main reason that kzfree() exists is to clear sensitive information that should not be leaked to other future users of the same memory objects. Rename kzfree() to kfree_sensitive() to follow the example of the recently added kvfree_sensitive() and make the intention of the API more explicit. In addition, memzero_explicit() is used to clear the memory to make sure that it won't get optimized away by the compiler. The renaming is done by using the command sequence: git grep -w --name-only kzfree |\ xargs sed -i 's/kzfree/kfree_sensitive/' followed by some editing of the kfree_sensitive() kerneldoc and adding a kzfree backward compatibility macro in slab.h. [akpm@linux-foundation.org: fs/crypto/inline_crypt.c needs linux/slab.h] [akpm@linux-foundation.org: fix fs/crypto/inline_crypt.c some more] Suggested-by: Joe Perches <joe@perches.com> Signed-off-by: Waiman Long <longman@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: David Howells <dhowells@redhat.com> Acked-by: Michal Hocko <mhocko@suse.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Cc: James Morris <jmorris@namei.org> Cc: "Serge E. Hallyn" <serge@hallyn.com> Cc: Joe Perches <joe@perches.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: David Rientjes <rientjes@google.com> Cc: Dan Carpenter <dan.carpenter@oracle.com> Cc: "Jason A . Donenfeld" <Jason@zx2c4.com> Link: http://lkml.kernel.org/r/20200616154311.12314-3-longman@redhat.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

zatwierdzone przez
Linus Torvalds

rodzic
57c720d414
commit
453431a549
@@ -180,7 +180,7 @@ static int cache_hit(in_cache_entry *entry, struct mpoa_client *mpc)
|
||||
static void in_cache_put(in_cache_entry *entry)
|
||||
{
|
||||
if (refcount_dec_and_test(&entry->use)) {
|
||||
kzfree(entry);
|
||||
kfree_sensitive(entry);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ static eg_cache_entry *eg_cache_get_by_src_ip(__be32 ipaddr,
|
||||
static void eg_cache_put(eg_cache_entry *entry)
|
||||
{
|
||||
if (refcount_dec_and_test(&entry->use)) {
|
||||
kzfree(entry);
|
||||
kfree_sensitive(entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -104,7 +104,7 @@ int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
|
||||
free_all:
|
||||
kpp_request_free(req);
|
||||
free_tmp:
|
||||
kzfree(tmp);
|
||||
kfree_sensitive(tmp);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -151,9 +151,9 @@ int set_ecdh_privkey(struct crypto_kpp *tfm, const u8 private_key[32])
|
||||
err = crypto_kpp_set_secret(tfm, buf, buf_len);
|
||||
/* fall through */
|
||||
free_all:
|
||||
kzfree(buf);
|
||||
kfree_sensitive(buf);
|
||||
free_tmp:
|
||||
kzfree(tmp);
|
||||
kfree_sensitive(tmp);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@@ -753,9 +753,9 @@ static void smp_chan_destroy(struct l2cap_conn *conn)
|
||||
complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
|
||||
mgmt_smp_complete(hcon, complete);
|
||||
|
||||
kzfree(smp->csrk);
|
||||
kzfree(smp->slave_csrk);
|
||||
kzfree(smp->link_key);
|
||||
kfree_sensitive(smp->csrk);
|
||||
kfree_sensitive(smp->slave_csrk);
|
||||
kfree_sensitive(smp->link_key);
|
||||
|
||||
crypto_free_shash(smp->tfm_cmac);
|
||||
crypto_free_kpp(smp->tfm_ecdh);
|
||||
@@ -789,7 +789,7 @@ static void smp_chan_destroy(struct l2cap_conn *conn)
|
||||
}
|
||||
|
||||
chan->data = NULL;
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
hci_conn_drop(hcon);
|
||||
}
|
||||
|
||||
@@ -1156,7 +1156,7 @@ static void sc_generate_link_key(struct smp_chan *smp)
|
||||
const u8 salt[16] = { 0x31, 0x70, 0x6d, 0x74 };
|
||||
|
||||
if (smp_h7(smp->tfm_cmac, smp->tk, salt, smp->link_key)) {
|
||||
kzfree(smp->link_key);
|
||||
kfree_sensitive(smp->link_key);
|
||||
smp->link_key = NULL;
|
||||
return;
|
||||
}
|
||||
@@ -1165,14 +1165,14 @@ static void sc_generate_link_key(struct smp_chan *smp)
|
||||
const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
|
||||
|
||||
if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
|
||||
kzfree(smp->link_key);
|
||||
kfree_sensitive(smp->link_key);
|
||||
smp->link_key = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
|
||||
kzfree(smp->link_key);
|
||||
kfree_sensitive(smp->link_key);
|
||||
smp->link_key = NULL;
|
||||
return;
|
||||
}
|
||||
@@ -1407,7 +1407,7 @@ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
|
||||
free_shash:
|
||||
crypto_free_shash(smp->tfm_cmac);
|
||||
zfree_smp:
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -3278,7 +3278,7 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
|
||||
tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
|
||||
if (IS_ERR(tfm_cmac)) {
|
||||
BT_ERR("Unable to create CMAC crypto context");
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
return ERR_CAST(tfm_cmac);
|
||||
}
|
||||
|
||||
@@ -3286,7 +3286,7 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
|
||||
if (IS_ERR(tfm_ecdh)) {
|
||||
BT_ERR("Unable to create ECDH crypto context");
|
||||
crypto_free_shash(tfm_cmac);
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
return ERR_CAST(tfm_ecdh);
|
||||
}
|
||||
|
||||
@@ -3300,7 +3300,7 @@ create_chan:
|
||||
if (smp) {
|
||||
crypto_free_shash(smp->tfm_cmac);
|
||||
crypto_free_kpp(smp->tfm_ecdh);
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
}
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
@@ -3347,7 +3347,7 @@ static void smp_del_chan(struct l2cap_chan *chan)
|
||||
chan->data = NULL;
|
||||
crypto_free_shash(smp->tfm_cmac);
|
||||
crypto_free_kpp(smp->tfm_ecdh);
|
||||
kzfree(smp);
|
||||
kfree_sensitive(smp);
|
||||
}
|
||||
|
||||
l2cap_chan_put(chan);
|
||||
|
@@ -2257,7 +2257,7 @@ static inline void __sock_kfree_s(struct sock *sk, void *mem, int size,
|
||||
if (WARN_ON_ONCE(!mem))
|
||||
return;
|
||||
if (nullify)
|
||||
kzfree(mem);
|
||||
kfree_sensitive(mem);
|
||||
else
|
||||
kfree(mem);
|
||||
atomic_sub(size, &sk->sk_omem_alloc);
|
||||
|
@@ -38,7 +38,7 @@ static void tcp_fastopen_ctx_free(struct rcu_head *head)
|
||||
struct tcp_fastopen_context *ctx =
|
||||
container_of(head, struct tcp_fastopen_context, rcu);
|
||||
|
||||
kzfree(ctx);
|
||||
kfree_sensitive(ctx);
|
||||
}
|
||||
|
||||
void tcp_fastopen_destroy_cipher(struct sock *sk)
|
||||
|
@@ -41,7 +41,7 @@ int aead_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
|
||||
aead_request_set_ad(aead_req, sg[0].length);
|
||||
|
||||
crypto_aead_encrypt(aead_req);
|
||||
kzfree(aead_req);
|
||||
kfree_sensitive(aead_req);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -76,7 +76,7 @@ int aead_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, size_t aad_len,
|
||||
aead_request_set_ad(aead_req, sg[0].length);
|
||||
|
||||
err = crypto_aead_decrypt(aead_req);
|
||||
kzfree(aead_req);
|
||||
kfree_sensitive(aead_req);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@@ -60,7 +60,7 @@ int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
|
||||
aead_request_set_ad(aead_req, GMAC_AAD_LEN + data_len);
|
||||
|
||||
crypto_aead_encrypt(aead_req);
|
||||
kzfree(aead_req);
|
||||
kfree_sensitive(aead_req);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -732,7 +732,7 @@ static void ieee80211_key_free_common(struct ieee80211_key *key)
|
||||
ieee80211_aes_gcm_key_free(key->u.gcmp.tfm);
|
||||
break;
|
||||
}
|
||||
kzfree(key);
|
||||
kfree_sensitive(key);
|
||||
}
|
||||
|
||||
static void __ieee80211_key_destroy(struct ieee80211_key *key,
|
||||
|
@@ -49,7 +49,7 @@ void mac802154_llsec_destroy(struct mac802154_llsec *sec)
|
||||
|
||||
msl = container_of(sl, struct mac802154_llsec_seclevel, level);
|
||||
list_del(&sl->list);
|
||||
kzfree(msl);
|
||||
kfree_sensitive(msl);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(dev, dn, &sec->table.devices, list) {
|
||||
@@ -66,7 +66,7 @@ void mac802154_llsec_destroy(struct mac802154_llsec *sec)
|
||||
mkey = container_of(key->key, struct mac802154_llsec_key, key);
|
||||
list_del(&key->list);
|
||||
llsec_key_put(mkey);
|
||||
kzfree(key);
|
||||
kfree_sensitive(key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ err_tfm:
|
||||
if (key->tfm[i])
|
||||
crypto_free_aead(key->tfm[i]);
|
||||
|
||||
kzfree(key);
|
||||
kfree_sensitive(key);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ static void llsec_key_release(struct kref *ref)
|
||||
crypto_free_aead(key->tfm[i]);
|
||||
|
||||
crypto_free_sync_skcipher(key->tfm0);
|
||||
kzfree(key);
|
||||
kfree_sensitive(key);
|
||||
}
|
||||
|
||||
static struct mac802154_llsec_key*
|
||||
@@ -261,7 +261,7 @@ int mac802154_llsec_key_add(struct mac802154_llsec *sec,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
kzfree(new);
|
||||
kfree_sensitive(new);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -341,10 +341,10 @@ static void llsec_dev_free(struct mac802154_llsec_device *dev)
|
||||
devkey);
|
||||
|
||||
list_del(&pos->list);
|
||||
kzfree(devkey);
|
||||
kfree_sensitive(devkey);
|
||||
}
|
||||
|
||||
kzfree(dev);
|
||||
kfree_sensitive(dev);
|
||||
}
|
||||
|
||||
int mac802154_llsec_dev_add(struct mac802154_llsec *sec,
|
||||
@@ -682,7 +682,7 @@ llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
|
||||
|
||||
rc = crypto_aead_encrypt(req);
|
||||
|
||||
kzfree(req);
|
||||
kfree_sensitive(req);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -886,7 +886,7 @@ llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
|
||||
|
||||
rc = crypto_aead_decrypt(req);
|
||||
|
||||
kzfree(req);
|
||||
kfree_sensitive(req);
|
||||
skb_trim(skb, skb->len - authlen);
|
||||
|
||||
return rc;
|
||||
@@ -926,7 +926,7 @@ llsec_update_devkey_record(struct mac802154_llsec_device *dev,
|
||||
if (!devkey)
|
||||
list_add_rcu(&next->devkey.list, &dev->dev.keys);
|
||||
else
|
||||
kzfree(next);
|
||||
kfree_sensitive(next);
|
||||
|
||||
spin_unlock_bh(&dev->lock);
|
||||
}
|
||||
|
@@ -49,7 +49,7 @@ void sctp_auth_key_put(struct sctp_auth_bytes *key)
|
||||
return;
|
||||
|
||||
if (refcount_dec_and_test(&key->refcnt)) {
|
||||
kzfree(key);
|
||||
kfree_sensitive(key);
|
||||
SCTP_DBG_OBJCNT_DEC(keys);
|
||||
}
|
||||
}
|
||||
|
@@ -1003,7 +1003,7 @@ krb5_rc4_setup_seq_key(struct krb5_ctx *kctx,
|
||||
err = 0;
|
||||
|
||||
out_err:
|
||||
kzfree(desc);
|
||||
kfree_sensitive(desc);
|
||||
crypto_free_shash(hmac);
|
||||
dprintk("%s: returning %d\n", __func__, err);
|
||||
return err;
|
||||
@@ -1079,7 +1079,7 @@ krb5_rc4_setup_enc_key(struct krb5_ctx *kctx,
|
||||
err = 0;
|
||||
|
||||
out_err:
|
||||
kzfree(desc);
|
||||
kfree_sensitive(desc);
|
||||
crypto_free_shash(hmac);
|
||||
dprintk("%s: returning %d\n", __func__, err);
|
||||
return err;
|
||||
|
@@ -228,11 +228,11 @@ u32 krb5_derive_key(const struct gss_krb5_enctype *gk5e,
|
||||
ret = 0;
|
||||
|
||||
err_free_raw:
|
||||
kzfree(rawkey);
|
||||
kfree_sensitive(rawkey);
|
||||
err_free_out:
|
||||
kzfree(outblockdata);
|
||||
kfree_sensitive(outblockdata);
|
||||
err_free_in:
|
||||
kzfree(inblockdata);
|
||||
kfree_sensitive(inblockdata);
|
||||
err_free_cipher:
|
||||
crypto_free_sync_skcipher(cipher);
|
||||
err_return:
|
||||
|
@@ -443,7 +443,7 @@ context_derive_keys_rc4(struct krb5_ctx *ctx)
|
||||
desc->tfm = hmac;
|
||||
|
||||
err = crypto_shash_digest(desc, sigkeyconstant, slen, ctx->cksum);
|
||||
kzfree(desc);
|
||||
kfree_sensitive(desc);
|
||||
if (err)
|
||||
goto out_err_free_hmac;
|
||||
/*
|
||||
|
@@ -441,7 +441,7 @@ static int tipc_aead_init(struct tipc_aead **aead, struct tipc_aead_key *ukey,
|
||||
/* Allocate per-cpu TFM entry pointer */
|
||||
tmp->tfm_entry = alloc_percpu(struct tipc_tfm *);
|
||||
if (!tmp->tfm_entry) {
|
||||
kzfree(tmp);
|
||||
kfree_sensitive(tmp);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -491,7 +491,7 @@ static int tipc_aead_init(struct tipc_aead **aead, struct tipc_aead_key *ukey,
|
||||
/* Not any TFM is allocated? */
|
||||
if (!tfm_cnt) {
|
||||
free_percpu(tmp->tfm_entry);
|
||||
kzfree(tmp);
|
||||
kfree_sensitive(tmp);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -545,7 +545,7 @@ static int tipc_aead_clone(struct tipc_aead **dst, struct tipc_aead *src)
|
||||
|
||||
aead->tfm_entry = alloc_percpu_gfp(struct tipc_tfm *, GFP_ATOMIC);
|
||||
if (unlikely(!aead->tfm_entry)) {
|
||||
kzfree(aead);
|
||||
kfree_sensitive(aead);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -1352,7 +1352,7 @@ int tipc_crypto_start(struct tipc_crypto **crypto, struct net *net,
|
||||
/* Allocate statistic structure */
|
||||
c->stats = alloc_percpu_gfp(struct tipc_crypto_stats, GFP_ATOMIC);
|
||||
if (!c->stats) {
|
||||
kzfree(c);
|
||||
kfree_sensitive(c);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -1408,7 +1408,7 @@ void tipc_crypto_stop(struct tipc_crypto **crypto)
|
||||
free_percpu(c->stats);
|
||||
|
||||
*crypto = NULL;
|
||||
kzfree(c);
|
||||
kfree_sensitive(c);
|
||||
}
|
||||
|
||||
void tipc_crypto_timeout(struct tipc_crypto *rx)
|
||||
|
@@ -1125,7 +1125,7 @@ static void __cfg80211_unregister_wdev(struct wireless_dev *wdev, bool sync)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
kzfree(wdev->wext.keys);
|
||||
kfree_sensitive(wdev->wext.keys);
|
||||
wdev->wext.keys = NULL;
|
||||
#endif
|
||||
/* only initialized if we have a netdev */
|
||||
|
@@ -127,7 +127,7 @@ int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
|
||||
return -EINVAL;
|
||||
|
||||
if (WARN_ON(wdev->connect_keys))
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = connkeys;
|
||||
|
||||
wdev->ibss_fixed = params->channel_fixed;
|
||||
@@ -161,7 +161,7 @@ static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
|
||||
rdev_set_qos_map(rdev, dev, NULL);
|
||||
|
@@ -131,7 +131,7 @@ static void lib80211_tkip_deinit(void *priv)
|
||||
crypto_free_shash(_priv->tx_tfm_michael);
|
||||
crypto_free_shash(_priv->rx_tfm_michael);
|
||||
}
|
||||
kzfree(priv);
|
||||
kfree_sensitive(priv);
|
||||
}
|
||||
|
||||
static inline u16 RotR1(u16 val)
|
||||
|
@@ -56,7 +56,7 @@ static void *lib80211_wep_init(int keyidx)
|
||||
|
||||
static void lib80211_wep_deinit(void *priv)
|
||||
{
|
||||
kzfree(priv);
|
||||
kfree_sensitive(priv);
|
||||
}
|
||||
|
||||
/* Add WEP IV/key info to a frame that has at least 4 bytes of headroom */
|
||||
|
@@ -9836,7 +9836,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if ((ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT) &&
|
||||
no_ht) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@@ -9848,7 +9848,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
int r = validate_pae_over_nl80211(rdev, info);
|
||||
|
||||
if (r < 0) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -9861,7 +9861,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
|
||||
wdev_lock(dev->ieee80211_ptr);
|
||||
err = __cfg80211_join_ibss(rdev, dev, &ibss, connkeys);
|
||||
if (err)
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
|
||||
dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
|
||||
wdev_unlock(dev->ieee80211_ptr);
|
||||
@@ -10289,7 +10289,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
|
||||
if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
memcpy(&connect.ht_capa,
|
||||
@@ -10307,7 +10307,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
|
||||
if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
memcpy(&connect.vht_capa,
|
||||
@@ -10321,7 +10321,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
(rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_RRM)) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
connect.flags |= ASSOC_REQ_USE_RRM;
|
||||
@@ -10329,21 +10329,21 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
|
||||
if (connect.pbss && !rdev->wiphy.bands[NL80211_BAND_60GHZ]) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
|
||||
/* bss selection makes no sense if bssid is set */
|
||||
if (connect.bssid) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
|
||||
wiphy, &connect.bss_select);
|
||||
if (err) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@@ -10373,13 +10373,13 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
|
||||
info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
|
||||
info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
|
||||
if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
GENL_SET_ERR_MSG(info,
|
||||
"external auth requires connection ownership");
|
||||
return -EINVAL;
|
||||
@@ -10392,7 +10392,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
||||
err = cfg80211_connect(rdev, dev, &connect, connkeys,
|
||||
connect.prev_bssid);
|
||||
if (err)
|
||||
kzfree(connkeys);
|
||||
kfree_sensitive(connkeys);
|
||||
|
||||
if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
|
||||
dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
|
||||
|
@@ -742,7 +742,7 @@ void __cfg80211_connect_result(struct net_device *dev,
|
||||
}
|
||||
|
||||
if (cr->status != WLAN_STATUS_SUCCESS) {
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
wdev->ssid_len = 0;
|
||||
wdev->conn_owner_nlportid = 0;
|
||||
@@ -1098,7 +1098,7 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
|
||||
wdev->current_bss = NULL;
|
||||
wdev->ssid_len = 0;
|
||||
wdev->conn_owner_nlportid = 0;
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
|
||||
nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap);
|
||||
@@ -1281,7 +1281,7 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
||||
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
|
||||
wdev->conn_owner_nlportid = 0;
|
||||
|
@@ -871,7 +871,7 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
|
||||
}
|
||||
}
|
||||
|
||||
kzfree(wdev->connect_keys);
|
||||
kfree_sensitive(wdev->connect_keys);
|
||||
wdev->connect_keys = NULL;
|
||||
}
|
||||
|
||||
|
@@ -57,7 +57,7 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
|
||||
err = cfg80211_connect(rdev, wdev->netdev,
|
||||
&wdev->wext.connect, ck, prev_bssid);
|
||||
if (err)
|
||||
kzfree(ck);
|
||||
kfree_sensitive(ck);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
Reference in New Issue
Block a user