forked from mirrors/linux
		
	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:
		
							parent
							
								
									57c720d414
								
							
						
					
					
						commit
						453431a549
					
				
					 114 changed files with 323 additions and 320 deletions
				
			
		|  | @ -249,7 +249,7 @@ static void prng_tdes_deinstantiate(void) | |||
| { | ||||
| 	pr_debug("The prng module stopped " | ||||
| 		 "after running in triple DES mode\n"); | ||||
| 	kzfree(prng_data); | ||||
| 	kfree_sensitive(prng_data); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -442,7 +442,7 @@ static int __init prng_sha512_instantiate(void) | |||
| static void prng_sha512_deinstantiate(void) | ||||
| { | ||||
| 	pr_debug("The prng module stopped after running in SHA-512 mode\n"); | ||||
| 	kzfree(prng_data); | ||||
| 	kfree_sensitive(prng_data); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ static int get_e820_md5(struct e820_table *table, void *buf) | |||
| 	if (crypto_shash_digest(desc, (u8 *)table, size, buf)) | ||||
| 		ret = -EINVAL; | ||||
| 
 | ||||
| 	kzfree(desc); | ||||
| 	kfree_sensitive(desc); | ||||
| 
 | ||||
| free_tfm: | ||||
| 	crypto_free_shash(tfm); | ||||
|  |  | |||
|  | @ -177,7 +177,7 @@ static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key, | |||
| 	keyp += NHPOLY1305_KEY_SIZE; | ||||
| 	WARN_ON(keyp != &data->derived_keys[ARRAY_SIZE(data->derived_keys)]); | ||||
| out: | ||||
| 	kzfree(data); | ||||
| 	kfree_sensitive(data); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -183,7 +183,7 @@ static int ahash_setkey_unaligned(struct crypto_ahash *tfm, const u8 *key, | |||
| 	alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); | ||||
| 	memcpy(alignbuffer, key, keylen); | ||||
| 	ret = tfm->setkey(tfm, alignbuffer, keylen); | ||||
| 	kzfree(buffer); | ||||
| 	kfree_sensitive(buffer); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  | @ -302,7 +302,7 @@ static void ahash_restore_req(struct ahash_request *req, int err) | |||
| 	req->priv = NULL; | ||||
| 
 | ||||
| 	/* Free the req->priv.priv from the ADJUSTED request. */ | ||||
| 	kzfree(priv); | ||||
| 	kfree_sensitive(priv); | ||||
| } | ||||
| 
 | ||||
| static void ahash_notify_einprogress(struct ahash_request *req) | ||||
|  |  | |||
|  | @ -571,7 +571,7 @@ void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm) | |||
| 		alg->cra_exit(tfm); | ||||
| 	crypto_exit_ops(tfm); | ||||
| 	crypto_mod_put(alg); | ||||
| 	kzfree(mem); | ||||
| 	kfree_sensitive(mem); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(crypto_destroy_tfm); | ||||
| 
 | ||||
|  |  | |||
|  | @ -376,7 +376,7 @@ static int pefile_digest_pe(const void *pebuf, unsigned int pelen, | |||
| 	} | ||||
| 
 | ||||
| error: | ||||
| 	kzfree(desc); | ||||
| 	kfree_sensitive(desc); | ||||
| error_no_desc: | ||||
| 	crypto_free_shash(tfm); | ||||
| 	kleave(" = %d", ret); | ||||
|  | @ -447,6 +447,6 @@ int verify_pefile_signature(const void *pebuf, unsigned pelen, | |||
| 	ret = pefile_digest_pe(pebuf, pelen, &ctx); | ||||
| 
 | ||||
| error: | ||||
| 	kzfree(ctx.digest); | ||||
| 	kfree_sensitive(ctx.digest); | ||||
| 	return ret; | ||||
| } | ||||
|  |  | |||
|  | @ -163,7 +163,7 @@ static void __deflate_exit(void *ctx) | |||
| static void deflate_free_ctx(struct crypto_scomp *tfm, void *ctx) | ||||
| { | ||||
| 	__deflate_exit(ctx); | ||||
| 	kzfree(ctx); | ||||
| 	kfree_sensitive(ctx); | ||||
| } | ||||
| 
 | ||||
| static void deflate_exit(struct crypto_tfm *tfm) | ||||
|  |  | |||
|  | @ -1218,19 +1218,19 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg) | |||
| { | ||||
| 	if (!drbg) | ||||
| 		return; | ||||
| 	kzfree(drbg->Vbuf); | ||||
| 	kfree_sensitive(drbg->Vbuf); | ||||
| 	drbg->Vbuf = NULL; | ||||
| 	drbg->V = NULL; | ||||
| 	kzfree(drbg->Cbuf); | ||||
| 	kfree_sensitive(drbg->Cbuf); | ||||
| 	drbg->Cbuf = NULL; | ||||
| 	drbg->C = NULL; | ||||
| 	kzfree(drbg->scratchpadbuf); | ||||
| 	kfree_sensitive(drbg->scratchpadbuf); | ||||
| 	drbg->scratchpadbuf = NULL; | ||||
| 	drbg->reseed_ctr = 0; | ||||
| 	drbg->d_ops = NULL; | ||||
| 	drbg->core = NULL; | ||||
| 	if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) { | ||||
| 		kzfree(drbg->prev); | ||||
| 		kfree_sensitive(drbg->prev); | ||||
| 		drbg->prev = NULL; | ||||
| 		drbg->fips_primed = false; | ||||
| 	} | ||||
|  | @ -1701,7 +1701,7 @@ static int drbg_fini_hash_kernel(struct drbg_state *drbg) | |||
| 	struct sdesc *sdesc = (struct sdesc *)drbg->priv_data; | ||||
| 	if (sdesc) { | ||||
| 		crypto_free_shash(sdesc->shash.tfm); | ||||
| 		kzfree(sdesc); | ||||
| 		kfree_sensitive(sdesc); | ||||
| 	} | ||||
| 	drbg->priv_data = NULL; | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ static u64 *ecc_alloc_digits_space(unsigned int ndigits) | |||
| 
 | ||||
| static void ecc_free_digits_space(u64 *space) | ||||
| { | ||||
| 	kzfree(space); | ||||
| 	kfree_sensitive(space); | ||||
| } | ||||
| 
 | ||||
| static struct ecc_point *ecc_alloc_point(unsigned int ndigits) | ||||
|  | @ -101,9 +101,9 @@ static void ecc_free_point(struct ecc_point *p) | |||
| 	if (!p) | ||||
| 		return; | ||||
| 
 | ||||
| 	kzfree(p->x); | ||||
| 	kzfree(p->y); | ||||
| 	kzfree(p); | ||||
| 	kfree_sensitive(p->x); | ||||
| 	kfree_sensitive(p->y); | ||||
| 	kfree_sensitive(p); | ||||
| } | ||||
| 
 | ||||
| static void vli_clear(u64 *vli, unsigned int ndigits) | ||||
|  |  | |||
|  | @ -124,7 +124,7 @@ static int ecdh_compute_value(struct kpp_request *req) | |||
| 
 | ||||
| 	/* fall through */ | ||||
| free_all: | ||||
| 	kzfree(shared_secret); | ||||
| 	kfree_sensitive(shared_secret); | ||||
| free_pubkey: | ||||
| 	kfree(public_key); | ||||
| 	return ret; | ||||
|  |  | |||
|  | @ -139,7 +139,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, | |||
| 			       CRYPTO_TFM_REQ_MASK); | ||||
| 	err = crypto_ahash_setkey(ghash, (u8 *)&data->hash, sizeof(be128)); | ||||
| out: | ||||
| 	kzfree(data); | ||||
| 	kfree_sensitive(data); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -304,8 +304,8 @@ void gf128mul_free_64k(struct gf128mul_64k *t) | |||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < 16; i++) | ||||
| 		kzfree(t->t[i]); | ||||
| 	kzfree(t); | ||||
| 		kfree_sensitive(t->t[i]); | ||||
| 	kfree_sensitive(t); | ||||
| } | ||||
| EXPORT_SYMBOL(gf128mul_free_64k); | ||||
| 
 | ||||
|  |  | |||
|  | @ -57,7 +57,7 @@ void *jent_zalloc(unsigned int len) | |||
| 
 | ||||
| void jent_zfree(void *ptr) | ||||
| { | ||||
| 	kzfree(ptr); | ||||
| 	kfree_sensitive(ptr); | ||||
| } | ||||
| 
 | ||||
| int jent_fips_enabled(void) | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ int crypto_rng_reset(struct crypto_rng *tfm, const u8 *seed, unsigned int slen) | |||
| 	err = crypto_rng_alg(tfm)->seed(tfm, seed, slen); | ||||
| 	crypto_stats_rng_seed(alg, err); | ||||
| out: | ||||
| 	kzfree(buf); | ||||
| 	kfree_sensitive(buf); | ||||
| 	return err; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(crypto_rng_reset); | ||||
|  |  | |||
|  | @ -199,7 +199,7 @@ static int pkcs1pad_encrypt_sign_complete(struct akcipher_request *req, int err) | |||
| 	sg_copy_from_buffer(req->dst, | ||||
| 			    sg_nents_for_len(req->dst, ctx->key_size), | ||||
| 			    out_buf, ctx->key_size); | ||||
| 	kzfree(out_buf); | ||||
| 	kfree_sensitive(out_buf); | ||||
| 
 | ||||
| out: | ||||
| 	req->dst_len = ctx->key_size; | ||||
|  | @ -322,7 +322,7 @@ static int pkcs1pad_decrypt_complete(struct akcipher_request *req, int err) | |||
| 				out_buf + pos, req->dst_len); | ||||
| 
 | ||||
| done: | ||||
| 	kzfree(req_ctx->out_buf); | ||||
| 	kfree_sensitive(req_ctx->out_buf); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
|  | @ -500,7 +500,7 @@ static int pkcs1pad_verify_complete(struct akcipher_request *req, int err) | |||
| 		   req->dst_len) != 0) | ||||
| 		err = -EKEYREJECTED; | ||||
| done: | ||||
| 	kzfree(req_ctx->out_buf); | ||||
| 	kfree_sensitive(req_ctx->out_buf); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ static void seqiv_aead_encrypt_complete2(struct aead_request *req, int err) | |||
| 	memcpy(req->iv, subreq->iv, crypto_aead_ivsize(geniv)); | ||||
| 
 | ||||
| out: | ||||
| 	kzfree(subreq->iv); | ||||
| 	kfree_sensitive(subreq->iv); | ||||
| } | ||||
| 
 | ||||
| static void seqiv_aead_encrypt_complete(struct crypto_async_request *base, | ||||
|  |  | |||
|  | @ -44,7 +44,7 @@ static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, | |||
| 	alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); | ||||
| 	memcpy(alignbuffer, key, keylen); | ||||
| 	err = shash->setkey(tfm, alignbuffer, keylen); | ||||
| 	kzfree(buffer); | ||||
| 	kfree_sensitive(buffer); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -592,7 +592,7 @@ static int skcipher_setkey_unaligned(struct crypto_skcipher *tfm, | |||
| 	alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); | ||||
| 	memcpy(alignbuffer, key, keylen); | ||||
| 	ret = cipher->setkey(tfm, alignbuffer, keylen); | ||||
| 	kzfree(buffer); | ||||
| 	kfree_sensitive(buffer); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1744,7 +1744,7 @@ static int test_hash_vs_generic_impl(const char *driver, | |||
| 	kfree(vec.plaintext); | ||||
| 	kfree(vec.digest); | ||||
| 	crypto_free_shash(generic_tfm); | ||||
| 	kzfree(generic_desc); | ||||
| 	kfree_sensitive(generic_desc); | ||||
| 	return err; | ||||
| } | ||||
| #else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */ | ||||
|  | @ -3665,7 +3665,7 @@ static int drbg_cavs_test(const struct drbg_testvec *test, int pr, | |||
| 	if (IS_ERR(drng)) { | ||||
| 		printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for " | ||||
| 		       "%s\n", driver); | ||||
| 		kzfree(buf); | ||||
| 		kfree_sensitive(buf); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -3712,7 +3712,7 @@ static int drbg_cavs_test(const struct drbg_testvec *test, int pr, | |||
| 
 | ||||
| outbuf: | ||||
| 	crypto_free_rng(drng); | ||||
| 	kzfree(buf); | ||||
| 	kfree_sensitive(buf); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -137,7 +137,7 @@ static void __zstd_exit(void *ctx) | |||
| static void zstd_free_ctx(struct crypto_scomp *tfm, void *ctx) | ||||
| { | ||||
| 	__zstd_exit(ctx); | ||||
| 	kzfree(ctx); | ||||
| 	kfree_sensitive(ctx); | ||||
| } | ||||
| 
 | ||||
| static void zstd_exit(struct crypto_tfm *tfm) | ||||
|  |  | |||
|  | @ -254,7 +254,7 @@ static int sun8i_ce_cipher(struct skcipher_request *areq) | |||
| 		offset = areq->cryptlen - ivsize; | ||||
| 		if (rctx->op_dir & CE_DECRYPTION) { | ||||
| 			memcpy(areq->iv, backup_iv, ivsize); | ||||
| 			kzfree(backup_iv); | ||||
| 			kfree_sensitive(backup_iv); | ||||
| 		} else { | ||||
| 			scatterwalk_map_and_copy(areq->iv, areq->dst, offset, | ||||
| 						 ivsize, 0); | ||||
|  |  | |||
|  | @ -249,7 +249,7 @@ static int sun8i_ss_cipher(struct skcipher_request *areq) | |||
| 			if (rctx->op_dir & SS_DECRYPTION) { | ||||
| 				memcpy(areq->iv, backup_iv, ivsize); | ||||
| 				memzero_explicit(backup_iv, ivsize); | ||||
| 				kzfree(backup_iv); | ||||
| 				kfree_sensitive(backup_iv); | ||||
| 			} else { | ||||
| 				scatterwalk_map_and_copy(areq->iv, areq->dst, offset, | ||||
| 							 ivsize, 0); | ||||
|  |  | |||
|  | @ -252,8 +252,8 @@ static int meson_cipher(struct skcipher_request *areq) | |||
| 		} | ||||
| 	} | ||||
| theend: | ||||
| 	kzfree(bkeyiv); | ||||
| 	kzfree(backup_iv); | ||||
| 	kfree_sensitive(bkeyiv); | ||||
| 	kfree_sensitive(backup_iv); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ static void atmel_ecdh_done(struct atmel_i2c_work_data *work_data, void *areq, | |||
| 
 | ||||
| 	/* fall through */ | ||||
| free_work_data: | ||||
| 	kzfree(work_data); | ||||
| 	kfree_sensitive(work_data); | ||||
| 	kpp_request_complete(req, status); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -854,14 +854,14 @@ static int caam_rsa_dec(struct akcipher_request *req) | |||
| 
 | ||||
| static void caam_rsa_free_key(struct caam_rsa_key *key) | ||||
| { | ||||
| 	kzfree(key->d); | ||||
| 	kzfree(key->p); | ||||
| 	kzfree(key->q); | ||||
| 	kzfree(key->dp); | ||||
| 	kzfree(key->dq); | ||||
| 	kzfree(key->qinv); | ||||
| 	kzfree(key->tmp1); | ||||
| 	kzfree(key->tmp2); | ||||
| 	kfree_sensitive(key->d); | ||||
| 	kfree_sensitive(key->p); | ||||
| 	kfree_sensitive(key->q); | ||||
| 	kfree_sensitive(key->dp); | ||||
| 	kfree_sensitive(key->dq); | ||||
| 	kfree_sensitive(key->qinv); | ||||
| 	kfree_sensitive(key->tmp1); | ||||
| 	kfree_sensitive(key->tmp2); | ||||
| 	kfree(key->e); | ||||
| 	kfree(key->n); | ||||
| 	memset(key, 0, sizeof(*key)); | ||||
|  | @ -1018,17 +1018,17 @@ static void caam_rsa_set_priv_key_form(struct caam_rsa_ctx *ctx, | |||
| 	return; | ||||
| 
 | ||||
| free_dq: | ||||
| 	kzfree(rsa_key->dq); | ||||
| 	kfree_sensitive(rsa_key->dq); | ||||
| free_dp: | ||||
| 	kzfree(rsa_key->dp); | ||||
| 	kfree_sensitive(rsa_key->dp); | ||||
| free_tmp2: | ||||
| 	kzfree(rsa_key->tmp2); | ||||
| 	kfree_sensitive(rsa_key->tmp2); | ||||
| free_tmp1: | ||||
| 	kzfree(rsa_key->tmp1); | ||||
| 	kfree_sensitive(rsa_key->tmp1); | ||||
| free_q: | ||||
| 	kzfree(rsa_key->q); | ||||
| 	kfree_sensitive(rsa_key->q); | ||||
| free_p: | ||||
| 	kzfree(rsa_key->p); | ||||
| 	kfree_sensitive(rsa_key->p); | ||||
| } | ||||
| 
 | ||||
| static int caam_rsa_set_priv_key(struct crypto_akcipher *tfm, const void *key, | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ static void cleanup_worker_threads(struct cpt_vf *cptvf) | |||
| 	for (i = 0; i < cptvf->nr_queues; i++) | ||||
| 		tasklet_kill(&cwqe_info->vq_wqe[i].twork); | ||||
| 
 | ||||
| 	kzfree(cwqe_info); | ||||
| 	kfree_sensitive(cwqe_info); | ||||
| 	cptvf->wqe_info = NULL; | ||||
| } | ||||
| 
 | ||||
|  | @ -88,7 +88,7 @@ static void free_pending_queues(struct pending_qinfo *pqinfo) | |||
| 			continue; | ||||
| 
 | ||||
| 		/* free single queue */ | ||||
| 		kzfree((queue->head)); | ||||
| 		kfree_sensitive((queue->head)); | ||||
| 
 | ||||
| 		queue->front = 0; | ||||
| 		queue->rear = 0; | ||||
|  | @ -189,7 +189,7 @@ static void free_command_queues(struct cpt_vf *cptvf, | |||
| 			chunk->head = NULL; | ||||
| 			chunk->dma_addr = 0; | ||||
| 			hlist_del(&chunk->nextchunk); | ||||
| 			kzfree(chunk); | ||||
| 			kfree_sensitive(chunk); | ||||
| 		} | ||||
| 
 | ||||
| 		queue->nchunks = 0; | ||||
|  |  | |||
|  | @ -305,12 +305,12 @@ static void do_request_cleanup(struct cpt_vf *cptvf, | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	kzfree(info->scatter_components); | ||||
| 	kzfree(info->gather_components); | ||||
| 	kzfree(info->out_buffer); | ||||
| 	kzfree(info->in_buffer); | ||||
| 	kzfree((void *)info->completion_addr); | ||||
| 	kzfree(info); | ||||
| 	kfree_sensitive(info->scatter_components); | ||||
| 	kfree_sensitive(info->gather_components); | ||||
| 	kfree_sensitive(info->out_buffer); | ||||
| 	kfree_sensitive(info->in_buffer); | ||||
| 	kfree_sensitive((void *)info->completion_addr); | ||||
| 	kfree_sensitive(info); | ||||
| } | ||||
| 
 | ||||
| static void do_post_process(struct cpt_vf *cptvf, struct cpt_info_buffer *info) | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ static void nitrox_free_aqm_queues(struct nitrox_device *ndev) | |||
| 
 | ||||
| 	for (i = 0; i < ndev->nr_queues; i++) { | ||||
| 		nitrox_cmdq_cleanup(ndev->aqmq[i]); | ||||
| 		kzfree(ndev->aqmq[i]); | ||||
| 		kfree_sensitive(ndev->aqmq[i]); | ||||
| 		ndev->aqmq[i] = NULL; | ||||
| 	} | ||||
| } | ||||
|  | @ -122,7 +122,7 @@ static int nitrox_alloc_aqm_queues(struct nitrox_device *ndev) | |||
| 
 | ||||
| 		err = nitrox_cmdq_init(cmdq, AQM_Q_ALIGN_BYTES); | ||||
| 		if (err) { | ||||
| 			kzfree(cmdq); | ||||
| 			kfree_sensitive(cmdq); | ||||
| 			goto aqmq_fail; | ||||
| 		} | ||||
| 		ndev->aqmq[i] = cmdq; | ||||
|  |  | |||
|  | @ -260,7 +260,7 @@ void *zip_alloc_scomp_ctx_deflate(struct crypto_scomp *tfm) | |||
| 	ret = zip_ctx_init(zip_ctx, 0); | ||||
| 
 | ||||
| 	if (ret) { | ||||
| 		kzfree(zip_ctx); | ||||
| 		kfree_sensitive(zip_ctx); | ||||
| 		return ERR_PTR(ret); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -279,7 +279,7 @@ void *zip_alloc_scomp_ctx_lzs(struct crypto_scomp *tfm) | |||
| 	ret = zip_ctx_init(zip_ctx, 1); | ||||
| 
 | ||||
| 	if (ret) { | ||||
| 		kzfree(zip_ctx); | ||||
| 		kfree_sensitive(zip_ctx); | ||||
| 		return ERR_PTR(ret); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -291,7 +291,7 @@ void zip_free_scomp_ctx(struct crypto_scomp *tfm, void *ctx) | |||
| 	struct zip_kernel_ctx *zip_ctx = ctx; | ||||
| 
 | ||||
| 	zip_ctx_exit(zip_ctx); | ||||
| 	kzfree(zip_ctx); | ||||
| 	kfree_sensitive(zip_ctx); | ||||
| } | ||||
| 
 | ||||
| int zip_scomp_compress(struct crypto_scomp *tfm, | ||||
|  |  | |||
|  | @ -112,13 +112,13 @@ static int ccp_check_key_length(unsigned int len) | |||
| static void ccp_rsa_free_key_bufs(struct ccp_ctx *ctx) | ||||
| { | ||||
| 	/* Clean up old key data */ | ||||
| 	kzfree(ctx->u.rsa.e_buf); | ||||
| 	kfree_sensitive(ctx->u.rsa.e_buf); | ||||
| 	ctx->u.rsa.e_buf = NULL; | ||||
| 	ctx->u.rsa.e_len = 0; | ||||
| 	kzfree(ctx->u.rsa.n_buf); | ||||
| 	kfree_sensitive(ctx->u.rsa.n_buf); | ||||
| 	ctx->u.rsa.n_buf = NULL; | ||||
| 	ctx->u.rsa.n_len = 0; | ||||
| 	kzfree(ctx->u.rsa.d_buf); | ||||
| 	kfree_sensitive(ctx->u.rsa.d_buf); | ||||
| 	ctx->u.rsa.d_buf = NULL; | ||||
| 	ctx->u.rsa.d_len = 0; | ||||
| } | ||||
|  |  | |||
|  | @ -448,7 +448,7 @@ static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *authkey, | |||
| 		if (dma_mapping_error(dev, key_dma_addr)) { | ||||
| 			dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n", | ||||
| 				key, keylen); | ||||
| 			kzfree(key); | ||||
| 			kfree_sensitive(key); | ||||
| 			return -ENOMEM; | ||||
| 		} | ||||
| 		if (keylen > blocksize) { | ||||
|  | @ -533,7 +533,7 @@ static int cc_get_plain_hmac_key(struct crypto_aead *tfm, const u8 *authkey, | |||
| 	if (key_dma_addr) | ||||
| 		dma_unmap_single(dev, key_dma_addr, keylen, DMA_TO_DEVICE); | ||||
| 
 | ||||
| 	kzfree(key); | ||||
| 	kfree_sensitive(key); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -488,7 +488,7 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req) | |||
| 	if (areq_ctx->gen_ctx.iv_dma_addr) { | ||||
| 		dma_unmap_single(dev, areq_ctx->gen_ctx.iv_dma_addr, | ||||
| 				 hw_iv_size, DMA_BIDIRECTIONAL); | ||||
| 		kzfree(areq_ctx->gen_ctx.iv); | ||||
| 		kfree_sensitive(areq_ctx->gen_ctx.iv); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Release pool */ | ||||
|  | @ -559,7 +559,7 @@ static int cc_aead_chain_iv(struct cc_drvdata *drvdata, | |||
| 	if (dma_mapping_error(dev, areq_ctx->gen_ctx.iv_dma_addr)) { | ||||
| 		dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n", | ||||
| 			hw_iv_size, req->iv); | ||||
| 		kzfree(areq_ctx->gen_ctx.iv); | ||||
| 		kfree_sensitive(areq_ctx->gen_ctx.iv); | ||||
| 		areq_ctx->gen_ctx.iv = NULL; | ||||
| 		rc = -ENOMEM; | ||||
| 		goto chain_iv_exit; | ||||
|  |  | |||
|  | @ -257,7 +257,7 @@ static void cc_cipher_exit(struct crypto_tfm *tfm) | |||
| 		&ctx_p->user.key_dma_addr); | ||||
| 
 | ||||
| 	/* Free key buffer in context */ | ||||
| 	kzfree(ctx_p->user.key); | ||||
| 	kfree_sensitive(ctx_p->user.key); | ||||
| 	dev_dbg(dev, "Free key buffer in context. key=@%p\n", ctx_p->user.key); | ||||
| } | ||||
| 
 | ||||
|  | @ -881,7 +881,7 @@ static void cc_cipher_complete(struct device *dev, void *cc_req, int err) | |||
| 		/* Not a BACKLOG notification */ | ||||
| 		cc_unmap_cipher_request(dev, req_ctx, ivsize, src, dst); | ||||
| 		memcpy(req->iv, req_ctx->iv, ivsize); | ||||
| 		kzfree(req_ctx->iv); | ||||
| 		kfree_sensitive(req_ctx->iv); | ||||
| 	} | ||||
| 
 | ||||
| 	skcipher_request_complete(req, err); | ||||
|  | @ -994,7 +994,7 @@ static int cc_cipher_process(struct skcipher_request *req, | |||
| 
 | ||||
| exit_process: | ||||
| 	if (rc != -EINPROGRESS && rc != -EBUSY) { | ||||
| 		kzfree(req_ctx->iv); | ||||
| 		kfree_sensitive(req_ctx->iv); | ||||
| 	} | ||||
| 
 | ||||
| 	return rc; | ||||
|  |  | |||
|  | @ -764,7 +764,7 @@ static int cc_hash_setkey(struct crypto_ahash *ahash, const u8 *key, | |||
| 		if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) { | ||||
| 			dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n", | ||||
| 				ctx->key_params.key, keylen); | ||||
| 			kzfree(ctx->key_params.key); | ||||
| 			kfree_sensitive(ctx->key_params.key); | ||||
| 			return -ENOMEM; | ||||
| 		} | ||||
| 		dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n", | ||||
|  | @ -913,7 +913,7 @@ static int cc_hash_setkey(struct crypto_ahash *ahash, const u8 *key, | |||
| 			&ctx->key_params.key_dma_addr, ctx->key_params.keylen); | ||||
| 	} | ||||
| 
 | ||||
| 	kzfree(ctx->key_params.key); | ||||
| 	kfree_sensitive(ctx->key_params.key); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
|  | @ -950,7 +950,7 @@ static int cc_xcbc_setkey(struct crypto_ahash *ahash, | |||
| 	if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) { | ||||
| 		dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n", | ||||
| 			key, keylen); | ||||
| 		kzfree(ctx->key_params.key); | ||||
| 		kfree_sensitive(ctx->key_params.key); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 	dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n", | ||||
|  | @ -999,7 +999,7 @@ static int cc_xcbc_setkey(struct crypto_ahash *ahash, | |||
| 	dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n", | ||||
| 		&ctx->key_params.key_dma_addr, ctx->key_params.keylen); | ||||
| 
 | ||||
| 	kzfree(ctx->key_params.key); | ||||
| 	kfree_sensitive(ctx->key_params.key); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -107,7 +107,7 @@ void cc_req_mgr_fini(struct cc_drvdata *drvdata) | |||
| 	/* Kill tasklet */ | ||||
| 	tasklet_kill(&req_mgr_h->comptask); | ||||
| #endif | ||||
| 	kzfree(req_mgr_h); | ||||
| 	kfree_sensitive(req_mgr_h); | ||||
| 	drvdata->request_mgr_handle = NULL; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1157,7 +1157,7 @@ static int mv_cesa_ahmac_pad_init(struct ahash_request *req, | |||
| 		} | ||||
| 
 | ||||
| 		/* Set the memory region to 0 to avoid any leak. */ | ||||
| 		kzfree(keydup); | ||||
| 		kfree_sensitive(keydup); | ||||
| 
 | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
|  |  | |||
|  | @ -68,7 +68,7 @@ static void cleanup_worker_threads(struct otx_cptvf *cptvf) | |||
| 	for (i = 0; i < cptvf->num_queues; i++) | ||||
| 		tasklet_kill(&cwqe_info->vq_wqe[i].twork); | ||||
| 
 | ||||
| 	kzfree(cwqe_info); | ||||
| 	kfree_sensitive(cwqe_info); | ||||
| 	cptvf->wqe_info = NULL; | ||||
| } | ||||
| 
 | ||||
|  | @ -82,7 +82,7 @@ static void free_pending_queues(struct otx_cpt_pending_qinfo *pqinfo) | |||
| 			continue; | ||||
| 
 | ||||
| 		/* free single queue */ | ||||
| 		kzfree((queue->head)); | ||||
| 		kfree_sensitive((queue->head)); | ||||
| 		queue->front = 0; | ||||
| 		queue->rear = 0; | ||||
| 		queue->qlen = 0; | ||||
|  | @ -176,7 +176,7 @@ static void free_command_queues(struct otx_cptvf *cptvf, | |||
| 			chunk->head = NULL; | ||||
| 			chunk->dma_addr = 0; | ||||
| 			list_del(&chunk->nextchunk); | ||||
| 			kzfree(chunk); | ||||
| 			kfree_sensitive(chunk); | ||||
| 		} | ||||
| 		queue->num_chunks = 0; | ||||
| 		queue->idx = 0; | ||||
|  |  | |||
|  | @ -215,7 +215,7 @@ static inline void do_request_cleanup(struct pci_dev *pdev, | |||
| 						 DMA_BIDIRECTIONAL); | ||||
| 		} | ||||
| 	} | ||||
| 	kzfree(info); | ||||
| 	kfree_sensitive(info); | ||||
| } | ||||
| 
 | ||||
| struct otx_cptvf_wqe; | ||||
|  |  | |||
|  | @ -746,7 +746,7 @@ void nx_crypto_ctx_exit(struct crypto_tfm *tfm) | |||
| { | ||||
| 	struct nx_crypto_ctx *nx_ctx = crypto_tfm_ctx(tfm); | ||||
| 
 | ||||
| 	kzfree(nx_ctx->kmem); | ||||
| 	kfree_sensitive(nx_ctx->kmem); | ||||
| 	nx_ctx->csbcpb = NULL; | ||||
| 	nx_ctx->csbcpb_aead = NULL; | ||||
| 	nx_ctx->in_sg = NULL; | ||||
|  | @ -762,7 +762,7 @@ void nx_crypto_ctx_aead_exit(struct crypto_aead *tfm) | |||
| { | ||||
| 	struct nx_crypto_ctx *nx_ctx = crypto_aead_ctx(tfm); | ||||
| 
 | ||||
| 	kzfree(nx_ctx->kmem); | ||||
| 	kfree_sensitive(nx_ctx->kmem); | ||||
| } | ||||
| 
 | ||||
| static int nx_probe(struct vio_dev *viodev, const struct vio_device_id *id) | ||||
|  |  | |||
|  | @ -167,7 +167,7 @@ static int virtio_crypto_alg_skcipher_init_session( | |||
| 				num_in, vcrypto, GFP_ATOMIC); | ||||
| 	if (err < 0) { | ||||
| 		spin_unlock(&vcrypto->ctrl_lock); | ||||
| 		kzfree(cipher_key); | ||||
| 		kfree_sensitive(cipher_key); | ||||
| 		return err; | ||||
| 	} | ||||
| 	virtqueue_kick(vcrypto->ctrl_vq); | ||||
|  | @ -184,7 +184,7 @@ static int virtio_crypto_alg_skcipher_init_session( | |||
| 		spin_unlock(&vcrypto->ctrl_lock); | ||||
| 		pr_err("virtio_crypto: Create session failed status: %u\n", | ||||
| 			le32_to_cpu(vcrypto->input.status)); | ||||
| 		kzfree(cipher_key); | ||||
| 		kfree_sensitive(cipher_key); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -197,7 +197,7 @@ static int virtio_crypto_alg_skcipher_init_session( | |||
| 
 | ||||
| 	spin_unlock(&vcrypto->ctrl_lock); | ||||
| 
 | ||||
| 	kzfree(cipher_key); | ||||
| 	kfree_sensitive(cipher_key); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -472,9 +472,9 @@ __virtio_crypto_skcipher_do_req(struct virtio_crypto_sym_request *vc_sym_req, | |||
| 	return 0; | ||||
| 
 | ||||
| free_iv: | ||||
| 	kzfree(iv); | ||||
| 	kfree_sensitive(iv); | ||||
| free: | ||||
| 	kzfree(req_data); | ||||
| 	kfree_sensitive(req_data); | ||||
| 	kfree(sgs); | ||||
| 	return err; | ||||
| } | ||||
|  | @ -583,7 +583,7 @@ static void virtio_crypto_skcipher_finalize_req( | |||
| 		scatterwalk_map_and_copy(req->iv, req->dst, | ||||
| 					 req->cryptlen - AES_BLOCK_SIZE, | ||||
| 					 AES_BLOCK_SIZE, 0); | ||||
| 	kzfree(vc_sym_req->iv); | ||||
| 	kfree_sensitive(vc_sym_req->iv); | ||||
| 	virtcrypto_clear_request(&vc_sym_req->base); | ||||
| 
 | ||||
| 	crypto_finalize_skcipher_request(vc_sym_req->base.dataq->engine, | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ void | |||
| virtcrypto_clear_request(struct virtio_crypto_request *vc_req) | ||||
| { | ||||
| 	if (vc_req) { | ||||
| 		kzfree(vc_req->req_data); | ||||
| 		kfree_sensitive(vc_req->req_data); | ||||
| 		kfree(vc_req->sgs); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -407,7 +407,7 @@ static void crypt_iv_lmk_dtr(struct crypt_config *cc) | |||
| 		crypto_free_shash(lmk->hash_tfm); | ||||
| 	lmk->hash_tfm = NULL; | ||||
| 
 | ||||
| 	kzfree(lmk->seed); | ||||
| 	kfree_sensitive(lmk->seed); | ||||
| 	lmk->seed = NULL; | ||||
| } | ||||
| 
 | ||||
|  | @ -558,9 +558,9 @@ static void crypt_iv_tcw_dtr(struct crypt_config *cc) | |||
| { | ||||
| 	struct iv_tcw_private *tcw = &cc->iv_gen_private.tcw; | ||||
| 
 | ||||
| 	kzfree(tcw->iv_seed); | ||||
| 	kfree_sensitive(tcw->iv_seed); | ||||
| 	tcw->iv_seed = NULL; | ||||
| 	kzfree(tcw->whitening); | ||||
| 	kfree_sensitive(tcw->whitening); | ||||
| 	tcw->whitening = NULL; | ||||
| 
 | ||||
| 	if (tcw->crc32_tfm && !IS_ERR(tcw->crc32_tfm)) | ||||
|  | @ -994,8 +994,8 @@ static int crypt_iv_elephant(struct crypt_config *cc, struct dm_crypt_request *d | |||
| 
 | ||||
| 	kunmap_atomic(data); | ||||
| out: | ||||
| 	kzfree(ks); | ||||
| 	kzfree(es); | ||||
| 	kfree_sensitive(ks); | ||||
| 	kfree_sensitive(es); | ||||
| 	skcipher_request_free(req); | ||||
| 	return r; | ||||
| } | ||||
|  | @ -2294,7 +2294,7 @@ static int crypt_set_keyring_key(struct crypt_config *cc, const char *key_string | |||
| 
 | ||||
| 	key = request_key(type, key_desc + 1, NULL); | ||||
| 	if (IS_ERR(key)) { | ||||
| 		kzfree(new_key_string); | ||||
| 		kfree_sensitive(new_key_string); | ||||
| 		return PTR_ERR(key); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -2304,7 +2304,7 @@ static int crypt_set_keyring_key(struct crypt_config *cc, const char *key_string | |||
| 	if (ret < 0) { | ||||
| 		up_read(&key->sem); | ||||
| 		key_put(key); | ||||
| 		kzfree(new_key_string); | ||||
| 		kfree_sensitive(new_key_string); | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -2318,10 +2318,10 @@ static int crypt_set_keyring_key(struct crypt_config *cc, const char *key_string | |||
| 
 | ||||
| 	if (!ret) { | ||||
| 		set_bit(DM_CRYPT_KEY_VALID, &cc->flags); | ||||
| 		kzfree(cc->key_string); | ||||
| 		kfree_sensitive(cc->key_string); | ||||
| 		cc->key_string = new_key_string; | ||||
| 	} else | ||||
| 		kzfree(new_key_string); | ||||
| 		kfree_sensitive(new_key_string); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
|  | @ -2382,7 +2382,7 @@ static int crypt_set_key(struct crypt_config *cc, char *key) | |||
| 	clear_bit(DM_CRYPT_KEY_VALID, &cc->flags); | ||||
| 
 | ||||
| 	/* wipe references to any kernel keyring key */ | ||||
| 	kzfree(cc->key_string); | ||||
| 	kfree_sensitive(cc->key_string); | ||||
| 	cc->key_string = NULL; | ||||
| 
 | ||||
| 	/* Decode key from its hex representation. */ | ||||
|  | @ -2414,7 +2414,7 @@ static int crypt_wipe_key(struct crypt_config *cc) | |||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	kzfree(cc->key_string); | ||||
| 	kfree_sensitive(cc->key_string); | ||||
| 	cc->key_string = NULL; | ||||
| 	r = crypt_setkey(cc); | ||||
| 	memset(&cc->key, 0, cc->key_size * sizeof(u8)); | ||||
|  | @ -2493,15 +2493,15 @@ static void crypt_dtr(struct dm_target *ti) | |||
| 	if (cc->dev) | ||||
| 		dm_put_device(ti, cc->dev); | ||||
| 
 | ||||
| 	kzfree(cc->cipher_string); | ||||
| 	kzfree(cc->key_string); | ||||
| 	kzfree(cc->cipher_auth); | ||||
| 	kzfree(cc->authenc_key); | ||||
| 	kfree_sensitive(cc->cipher_string); | ||||
| 	kfree_sensitive(cc->key_string); | ||||
| 	kfree_sensitive(cc->cipher_auth); | ||||
| 	kfree_sensitive(cc->authenc_key); | ||||
| 
 | ||||
| 	mutex_destroy(&cc->bio_alloc_lock); | ||||
| 
 | ||||
| 	/* Must zero key material before freeing */ | ||||
| 	kzfree(cc); | ||||
| 	kfree_sensitive(cc); | ||||
| 
 | ||||
| 	spin_lock(&dm_crypt_clients_lock); | ||||
| 	WARN_ON(!dm_crypt_clients_n); | ||||
|  |  | |||
|  | @ -3405,8 +3405,8 @@ static struct scatterlist **dm_integrity_alloc_journal_scatterlist(struct dm_int | |||
| 
 | ||||
| static void free_alg(struct alg_spec *a) | ||||
| { | ||||
| 	kzfree(a->alg_string); | ||||
| 	kzfree(a->key); | ||||
| 	kfree_sensitive(a->alg_string); | ||||
| 	kfree_sensitive(a->key); | ||||
| 	memset(a, 0, sizeof *a); | ||||
| } | ||||
| 
 | ||||
|  | @ -4337,7 +4337,7 @@ static void dm_integrity_dtr(struct dm_target *ti) | |||
| 		for (i = 0; i < ic->journal_sections; i++) { | ||||
| 			struct skcipher_request *req = ic->sk_requests[i]; | ||||
| 			if (req) { | ||||
| 				kzfree(req->iv); | ||||
| 				kfree_sensitive(req->iv); | ||||
| 				skcipher_request_free(req); | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
|  | @ -286,7 +286,7 @@ static void *alloc_dma_buffer(struct vio_dev *vdev, size_t size, | |||
| 
 | ||||
| 	if (dma_mapping_error(&vdev->dev, *dma_handle)) { | ||||
| 		*dma_handle = 0; | ||||
| 		kzfree(buffer); | ||||
| 		kfree_sensitive(buffer); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -310,7 +310,7 @@ static void free_dma_buffer(struct vio_dev *vdev, size_t size, void *vaddr, | |||
| 	dma_unmap_single(&vdev->dev, dma_handle, size, DMA_BIDIRECTIONAL); | ||||
| 
 | ||||
| 	/* deallocate memory */ | ||||
| 	kzfree(vaddr); | ||||
| 	kfree_sensitive(vaddr); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -883,7 +883,7 @@ static int ibmvmc_close(struct inode *inode, struct file *file) | |||
| 		spin_unlock_irqrestore(&hmc->lock, flags); | ||||
| 	} | ||||
| 
 | ||||
| 	kzfree(session); | ||||
| 	kfree_sensitive(session); | ||||
| 
 | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -137,7 +137,7 @@ static void hclge_free_vector_ring_chain(struct hnae3_ring_chain_node *head) | |||
| 
 | ||||
| 	while (chain) { | ||||
| 		chain_tmp = chain->next; | ||||
| 		kzfree(chain); | ||||
| 		kfree_sensitive(chain); | ||||
| 		chain = chain_tmp; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -960,9 +960,9 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) | |||
| 	return 0; | ||||
| 
 | ||||
| err_aead: | ||||
| 	kzfree(xs->aead); | ||||
| 	kfree_sensitive(xs->aead); | ||||
| err_xs: | ||||
| 	kzfree(xs); | ||||
| 	kfree_sensitive(xs); | ||||
| err_out: | ||||
| 	msgbuf[1] = err; | ||||
| 	return err; | ||||
|  | @ -1047,7 +1047,7 @@ int ixgbe_ipsec_vf_del_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) | |||
| 	ixgbe_ipsec_del_sa(xs); | ||||
| 
 | ||||
| 	/* remove the xs that was made-up in the add request */ | ||||
| 	kzfree(xs); | ||||
| 	kfree_sensitive(xs); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -222,7 +222,7 @@ static void *mppe_alloc(unsigned char *options, int optlen) | |||
| 	kfree(state->sha1_digest); | ||||
| 	if (state->sha1) { | ||||
| 		crypto_free_shash(state->sha1->tfm); | ||||
| 		kzfree(state->sha1); | ||||
| 		kfree_sensitive(state->sha1); | ||||
| 	} | ||||
| 	kfree(state); | ||||
| out: | ||||
|  | @ -238,8 +238,8 @@ static void mppe_free(void *arg) | |||
| 	if (state) { | ||||
| 		kfree(state->sha1_digest); | ||||
| 		crypto_free_shash(state->sha1->tfm); | ||||
| 		kzfree(state->sha1); | ||||
| 		kzfree(state); | ||||
| 		kfree_sensitive(state->sha1); | ||||
| 		kfree_sensitive(state); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -114,7 +114,7 @@ static struct noise_keypair *keypair_create(struct wg_peer *peer) | |||
| 
 | ||||
| static void keypair_free_rcu(struct rcu_head *rcu) | ||||
| { | ||||
| 	kzfree(container_of(rcu, struct noise_keypair, rcu)); | ||||
| 	kfree_sensitive(container_of(rcu, struct noise_keypair, rcu)); | ||||
| } | ||||
| 
 | ||||
| static void keypair_free_kref(struct kref *kref) | ||||
|  | @ -821,7 +821,7 @@ bool wg_noise_handshake_begin_session(struct noise_handshake *handshake, | |||
| 			handshake->entry.peer->device->index_hashtable, | ||||
| 			&handshake->entry, &new_keypair->entry); | ||||
| 	} else { | ||||
| 		kzfree(new_keypair); | ||||
| 		kfree_sensitive(new_keypair); | ||||
| 	} | ||||
| 	rcu_read_unlock_bh(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -203,7 +203,7 @@ static void rcu_release(struct rcu_head *rcu) | |||
| 	/* The final zeroing takes care of clearing any remaining handshake key
 | ||||
| 	 * material and other potentially sensitive information. | ||||
| 	 */ | ||||
| 	kzfree(peer); | ||||
| 	kfree_sensitive(peer); | ||||
| } | ||||
| 
 | ||||
| static void kref_release(struct kref *refcount) | ||||
|  |  | |||
|  | @ -1369,7 +1369,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans, | |||
| 					   &rxcb, rxq->id); | ||||
| 
 | ||||
| 		if (reclaim) { | ||||
| 			kzfree(txq->entries[cmd_index].free_buf); | ||||
| 			kfree_sensitive(txq->entries[cmd_index].free_buf); | ||||
| 			txq->entries[cmd_index].free_buf = NULL; | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -1026,7 +1026,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans, | |||
| 	BUILD_BUG_ON(IWL_TFH_NUM_TBS > sizeof(out_meta->tbs) * BITS_PER_BYTE); | ||||
| 	out_meta->flags = cmd->flags; | ||||
| 	if (WARN_ON_ONCE(txq->entries[idx].free_buf)) | ||||
| 		kzfree(txq->entries[idx].free_buf); | ||||
| 		kfree_sensitive(txq->entries[idx].free_buf); | ||||
| 	txq->entries[idx].free_buf = dup_buf; | ||||
| 
 | ||||
| 	trace_iwlwifi_dev_hcmd(trans->dev, cmd, cmd_size, &out_cmd->hdr_wide); | ||||
|  | @ -1257,8 +1257,8 @@ static void iwl_pcie_gen2_txq_free(struct iwl_trans *trans, int txq_id) | |||
| 	/* De-alloc array of command/tx buffers */ | ||||
| 	if (txq_id == trans->txqs.cmd.q_id) | ||||
| 		for (i = 0; i < txq->n_window; i++) { | ||||
| 			kzfree(txq->entries[i].cmd); | ||||
| 			kzfree(txq->entries[i].free_buf); | ||||
| 			kfree_sensitive(txq->entries[i].cmd); | ||||
| 			kfree_sensitive(txq->entries[i].free_buf); | ||||
| 		} | ||||
| 	del_timer_sync(&txq->stuck_timer); | ||||
| 
 | ||||
|  |  | |||
|  | @ -721,8 +721,8 @@ static void iwl_pcie_txq_free(struct iwl_trans *trans, int txq_id) | |||
| 	/* De-alloc array of command/tx buffers */ | ||||
| 	if (txq_id == trans->txqs.cmd.q_id) | ||||
| 		for (i = 0; i < txq->n_window; i++) { | ||||
| 			kzfree(txq->entries[i].cmd); | ||||
| 			kzfree(txq->entries[i].free_buf); | ||||
| 			kfree_sensitive(txq->entries[i].cmd); | ||||
| 			kfree_sensitive(txq->entries[i].free_buf); | ||||
| 		} | ||||
| 
 | ||||
| 	/* De-alloc circular buffer of TFDs */ | ||||
|  | @ -1765,7 +1765,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans, | |||
| 	BUILD_BUG_ON(IWL_TFH_NUM_TBS > sizeof(out_meta->tbs) * BITS_PER_BYTE); | ||||
| 	out_meta->flags = cmd->flags; | ||||
| 	if (WARN_ON_ONCE(txq->entries[idx].free_buf)) | ||||
| 		kzfree(txq->entries[idx].free_buf); | ||||
| 		kfree_sensitive(txq->entries[idx].free_buf); | ||||
| 	txq->entries[idx].free_buf = dup_buf; | ||||
| 
 | ||||
| 	trace_iwlwifi_dev_hcmd(trans->dev, cmd, cmd_size, &out_cmd->hdr_wide); | ||||
|  |  | |||
|  | @ -31,8 +31,8 @@ static int orinoco_set_key(struct orinoco_private *priv, int index, | |||
| 			   enum orinoco_alg alg, const u8 *key, int key_len, | ||||
| 			   const u8 *seq, int seq_len) | ||||
| { | ||||
| 	kzfree(priv->keys[index].key); | ||||
| 	kzfree(priv->keys[index].seq); | ||||
| 	kfree_sensitive(priv->keys[index].key); | ||||
| 	kfree_sensitive(priv->keys[index].seq); | ||||
| 
 | ||||
| 	if (key_len) { | ||||
| 		priv->keys[index].key = kzalloc(key_len, GFP_ATOMIC); | ||||
|  |  | |||
|  | @ -219,8 +219,8 @@ static inline void ap_init_message(struct ap_message *ap_msg) | |||
|  */ | ||||
| static inline void ap_release_message(struct ap_message *ap_msg) | ||||
| { | ||||
| 	kzfree(ap_msg->msg); | ||||
| 	kzfree(ap_msg->private); | ||||
| 	kfree_sensitive(ap_msg->msg); | ||||
| 	kfree_sensitive(ap_msg->private); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
|  | @ -245,7 +245,7 @@ michael_mic(u8 *key, u8 *data, unsigned int len, u8 priority, u8 *result) | |||
| 	ret = crypto_shash_finup(desc, data + 12, len - 12, result); | ||||
| 
 | ||||
| err_free_desc: | ||||
| 	kzfree(desc); | ||||
| 	kfree_sensitive(desc); | ||||
| 
 | ||||
| err_free_tfm: | ||||
| 	crypto_free_shash(tfm); | ||||
|  |  | |||
|  | @ -2251,7 +2251,7 @@ static void gf_mulx(u8 *pad) | |||
| 
 | ||||
| static void aes_encrypt_deinit(void *ctx) | ||||
| { | ||||
| 	kzfree(ctx); | ||||
| 	kfree_sensitive(ctx); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -429,7 +429,7 @@ static netdev_tx_t p80211knetdev_hard_start_xmit(struct sk_buff *skb, | |||
| failed: | ||||
| 	/* Free up the WEP buffer if it's not the same as the skb */ | ||||
| 	if ((p80211_wep.data) && (p80211_wep.data != skb->data)) | ||||
| 		kzfree(p80211_wep.data); | ||||
| 		kfree_sensitive(p80211_wep.data); | ||||
| 
 | ||||
| 	/* we always free the skb here, never in a lower level. */ | ||||
| 	if (!result) | ||||
|  |  | |||
|  | @ -484,7 +484,7 @@ static int chap_server_compute_hash( | |||
| 	pr_debug("[server] Sending CHAP_R=0x%s\n", response); | ||||
| 	auth_ret = 0; | ||||
| out: | ||||
| 	kzfree(desc); | ||||
| 	kfree_sensitive(desc); | ||||
| 	if (tfm) | ||||
| 		crypto_free_shash(tfm); | ||||
| 	kfree(initiatorchg); | ||||
|  |  | |||
|  | @ -797,7 +797,7 @@ calc_seckey(struct cifs_ses *ses) | |||
| 	ses->auth_key.len = CIFS_SESS_KEY_SIZE; | ||||
| 
 | ||||
| 	memzero_explicit(sec_key, CIFS_SESS_KEY_SIZE); | ||||
| 	kzfree(ctx_arc4); | ||||
| 	kfree_sensitive(ctx_arc4); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -2182,7 +2182,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 			tmp_end++; | ||||
| 			if (!(tmp_end < end && tmp_end[1] == delim)) { | ||||
| 				/* No it is not. Set the password to NULL */ | ||||
| 				kzfree(vol->password); | ||||
| 				kfree_sensitive(vol->password); | ||||
| 				vol->password = NULL; | ||||
| 				break; | ||||
| 			} | ||||
|  | @ -2220,7 +2220,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 					options = end; | ||||
| 			} | ||||
| 
 | ||||
| 			kzfree(vol->password); | ||||
| 			kfree_sensitive(vol->password); | ||||
| 			/* Now build new password string */ | ||||
| 			temp_len = strlen(value); | ||||
| 			vol->password = kzalloc(temp_len+1, GFP_KERNEL); | ||||
|  | @ -3198,7 +3198,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses) | |||
| 			rc = -ENOMEM; | ||||
| 			kfree(vol->username); | ||||
| 			vol->username = NULL; | ||||
| 			kzfree(vol->password); | ||||
| 			kfree_sensitive(vol->password); | ||||
| 			vol->password = NULL; | ||||
| 			goto out_key_put; | ||||
| 		} | ||||
|  | @ -4219,7 +4219,7 @@ void | |||
| cifs_cleanup_volume_info_contents(struct smb_vol *volume_info) | ||||
| { | ||||
| 	kfree(volume_info->username); | ||||
| 	kzfree(volume_info->password); | ||||
| 	kfree_sensitive(volume_info->password); | ||||
| 	kfree(volume_info->UNC); | ||||
| 	kfree(volume_info->domainname); | ||||
| 	kfree(volume_info->iocharset); | ||||
|  | @ -5345,7 +5345,7 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) | |||
| 
 | ||||
| out: | ||||
| 	kfree(vol_info->username); | ||||
| 	kzfree(vol_info->password); | ||||
| 	kfree_sensitive(vol_info->password); | ||||
| 	kfree(vol_info); | ||||
| 
 | ||||
| 	return tcon; | ||||
|  |  | |||
|  | @ -1131,7 +1131,7 @@ static int dup_vol(struct smb_vol *vol, struct smb_vol *new) | |||
| err_free_unc: | ||||
| 	kfree(new->UNC); | ||||
| err_free_password: | ||||
| 	kzfree(new->password); | ||||
| 	kfree_sensitive(new->password); | ||||
| err_free_username: | ||||
| 	kfree(new->username); | ||||
| 	kfree(new); | ||||
|  |  | |||
|  | @ -103,12 +103,12 @@ sesInfoFree(struct cifs_ses *buf_to_free) | |||
| 	kfree(buf_to_free->serverOS); | ||||
| 	kfree(buf_to_free->serverDomain); | ||||
| 	kfree(buf_to_free->serverNOS); | ||||
| 	kzfree(buf_to_free->password); | ||||
| 	kfree_sensitive(buf_to_free->password); | ||||
| 	kfree(buf_to_free->user_name); | ||||
| 	kfree(buf_to_free->domainName); | ||||
| 	kzfree(buf_to_free->auth_key.response); | ||||
| 	kfree_sensitive(buf_to_free->auth_key.response); | ||||
| 	kfree(buf_to_free->iface_list); | ||||
| 	kzfree(buf_to_free); | ||||
| 	kfree_sensitive(buf_to_free); | ||||
| } | ||||
| 
 | ||||
| struct cifs_tcon * | ||||
|  | @ -148,7 +148,7 @@ tconInfoFree(struct cifs_tcon *buf_to_free) | |||
| 	} | ||||
| 	atomic_dec(&tconInfoAllocCount); | ||||
| 	kfree(buf_to_free->nativeFileSystem); | ||||
| 	kzfree(buf_to_free->password); | ||||
| 	kfree_sensitive(buf_to_free->password); | ||||
| 	kfree(buf_to_free->crfid.fid); | ||||
| #ifdef CONFIG_CIFS_DFS_UPCALL | ||||
| 	kfree(buf_to_free->dfs_path); | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| #include <linux/blkdev.h> | ||||
| #include <linux/buffer_head.h> | ||||
| #include <linux/sched/mm.h> | ||||
| #include <linux/slab.h> | ||||
| 
 | ||||
| #include "fscrypt_private.h" | ||||
| 
 | ||||
|  | @ -187,7 +188,7 @@ int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, | |||
| fail: | ||||
| 	for (i = 0; i < queue_refs; i++) | ||||
| 		blk_put_queue(blk_key->devs[i]); | ||||
| 	kzfree(blk_key); | ||||
| 	kfree_sensitive(blk_key); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  | @ -201,7 +202,7 @@ void fscrypt_destroy_inline_crypt_key(struct fscrypt_prepared_key *prep_key) | |||
| 			blk_crypto_evict_key(blk_key->devs[i], &blk_key->base); | ||||
| 			blk_put_queue(blk_key->devs[i]); | ||||
| 		} | ||||
| 		kzfree(blk_key); | ||||
| 		kfree_sensitive(blk_key); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ static void free_master_key(struct fscrypt_master_key *mk) | |||
| 	} | ||||
| 
 | ||||
| 	key_put(mk->mk_users); | ||||
| 	kzfree(mk); | ||||
| 	kfree_sensitive(mk); | ||||
| } | ||||
| 
 | ||||
| static inline bool valid_key_spec(const struct fscrypt_key_specifier *spec) | ||||
|  | @ -531,7 +531,7 @@ static int fscrypt_provisioning_key_preparse(struct key_preparsed_payload *prep) | |||
| static void fscrypt_provisioning_key_free_preparse( | ||||
| 					struct key_preparsed_payload *prep) | ||||
| { | ||||
| 	kzfree(prep->payload.data[0]); | ||||
| 	kfree_sensitive(prep->payload.data[0]); | ||||
| } | ||||
| 
 | ||||
| static void fscrypt_provisioning_key_describe(const struct key *key, | ||||
|  | @ -548,7 +548,7 @@ static void fscrypt_provisioning_key_describe(const struct key *key, | |||
| 
 | ||||
| static void fscrypt_provisioning_key_destroy(struct key *key) | ||||
| { | ||||
| 	kzfree(key->payload.data[0]); | ||||
| 	kfree_sensitive(key->payload.data[0]); | ||||
| } | ||||
| 
 | ||||
| static struct key_type key_type_fscrypt_provisioning = { | ||||
|  |  | |||
|  | @ -155,7 +155,7 @@ static void free_direct_key(struct fscrypt_direct_key *dk) | |||
| { | ||||
| 	if (dk) { | ||||
| 		fscrypt_destroy_prepared_key(&dk->dk_key); | ||||
| 		kzfree(dk); | ||||
| 		kfree_sensitive(dk); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -283,7 +283,7 @@ static int setup_v1_file_key_derived(struct fscrypt_info *ci, | |||
| 
 | ||||
| 	err = fscrypt_set_per_file_enc_key(ci, derived_key); | ||||
| out: | ||||
| 	kzfree(derived_key); | ||||
| 	kfree_sensitive(derived_key); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -838,7 +838,7 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, | |||
| out_release_free_unlock: | ||||
| 	crypto_free_shash(s->hash_tfm); | ||||
| out_free_unlock: | ||||
| 	kzfree(s->block_aligned_filename); | ||||
| 	kfree_sensitive(s->block_aligned_filename); | ||||
| out_unlock: | ||||
| 	mutex_unlock(s->tfm_mutex); | ||||
| out: | ||||
|  | @ -847,7 +847,7 @@ ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes, | |||
| 		key_put(auth_tok_key); | ||||
| 	} | ||||
| 	skcipher_request_free(s->skcipher_req); | ||||
| 	kzfree(s->hash_desc); | ||||
| 	kfree_sensitive(s->hash_desc); | ||||
| 	kfree(s); | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -175,7 +175,7 @@ int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon) | |||
| 	} | ||||
| 	hlist_del(&daemon->euid_chain); | ||||
| 	mutex_unlock(&daemon->mux); | ||||
| 	kzfree(daemon); | ||||
| 	kfree_sensitive(daemon); | ||||
| out: | ||||
| 	return rc; | ||||
| } | ||||
|  |  | |||
|  | @ -425,7 +425,7 @@ static inline struct aead_request *aead_request_alloc(struct crypto_aead *tfm, | |||
|  */ | ||||
| static inline void aead_request_free(struct aead_request *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -207,7 +207,7 @@ static inline struct akcipher_request *akcipher_request_alloc( | |||
|  */ | ||||
| static inline void akcipher_request_free(struct akcipher_request *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -230,7 +230,7 @@ void gf128mul_4k_bbe(be128 *a, const struct gf128mul_4k *t); | |||
| void gf128mul_x8_ble(le128 *r, const le128 *x); | ||||
| static inline void gf128mul_free_4k(struct gf128mul_4k *t) | ||||
| { | ||||
| 	kzfree(t); | ||||
| 	kfree_sensitive(t); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -606,7 +606,7 @@ static inline struct ahash_request *ahash_request_alloc( | |||
|  */ | ||||
| static inline void ahash_request_free(struct ahash_request *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| static inline void ahash_request_zero(struct ahash_request *req) | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ static inline struct acomp_req *__acomp_request_alloc(struct crypto_acomp *tfm) | |||
| 
 | ||||
| static inline void __acomp_request_free(struct acomp_req *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -187,7 +187,7 @@ static inline struct kpp_request *kpp_request_alloc(struct crypto_kpp *tfm, | |||
|  */ | ||||
| static inline void kpp_request_free(struct kpp_request *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -508,7 +508,7 @@ static inline struct skcipher_request *skcipher_request_alloc( | |||
|  */ | ||||
| static inline void skcipher_request_free(struct skcipher_request *req) | ||||
| { | ||||
| 	kzfree(req); | ||||
| 	kfree_sensitive(req); | ||||
| } | ||||
| 
 | ||||
| static inline void skcipher_request_zero(struct skcipher_request *req) | ||||
|  |  | |||
|  | @ -186,10 +186,12 @@ void memcg_deactivate_kmem_caches(struct mem_cgroup *, struct mem_cgroup *); | |||
|  */ | ||||
| void * __must_check krealloc(const void *, size_t, gfp_t); | ||||
| void kfree(const void *); | ||||
| void kzfree(const void *); | ||||
| void kfree_sensitive(const void *); | ||||
| size_t __ksize(const void *); | ||||
| size_t ksize(const void *); | ||||
| 
 | ||||
| #define kzfree(x)	kfree_sensitive(x)	/* For backward compatibility */ | ||||
| 
 | ||||
| #ifdef CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR | ||||
| void __check_heap_object(const void *ptr, unsigned long n, struct page *page, | ||||
| 			bool to_user); | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ void mpi_free_limb_space(mpi_ptr_t a) | |||
| 	if (!a) | ||||
| 		return; | ||||
| 
 | ||||
| 	kzfree(a); | ||||
| 	kfree_sensitive(a); | ||||
| } | ||||
| 
 | ||||
| void mpi_assign_limb_space(MPI a, mpi_ptr_t ap, unsigned nlimbs) | ||||
|  | @ -95,7 +95,7 @@ int mpi_resize(MPI a, unsigned nlimbs) | |||
| 		if (!p) | ||||
| 			return -ENOMEM; | ||||
| 		memcpy(p, a->d, a->alloced * sizeof(mpi_limb_t)); | ||||
| 		kzfree(a->d); | ||||
| 		kfree_sensitive(a->d); | ||||
| 		a->d = p; | ||||
| 	} else { | ||||
| 		a->d = kcalloc(nlimbs, sizeof(mpi_limb_t), GFP_KERNEL); | ||||
|  | @ -112,7 +112,7 @@ void mpi_free(MPI a) | |||
| 		return; | ||||
| 
 | ||||
| 	if (a->flags & 4) | ||||
| 		kzfree(a->d); | ||||
| 		kfree_sensitive(a->d); | ||||
| 	else | ||||
| 		mpi_free_limb_space(a->d); | ||||
| 
 | ||||
|  |  | |||
|  | @ -766,15 +766,15 @@ static noinline void __init kmalloc_double_kzfree(void) | |||
| 	char *ptr; | ||||
| 	size_t size = 16; | ||||
| 
 | ||||
| 	pr_info("double-free (kzfree)\n"); | ||||
| 	pr_info("double-free (kfree_sensitive)\n"); | ||||
| 	ptr = kmalloc(size, GFP_KERNEL); | ||||
| 	if (!ptr) { | ||||
| 		pr_err("Allocation failed\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	kzfree(ptr); | ||||
| 	kzfree(ptr); | ||||
| 	kfree_sensitive(ptr); | ||||
| 	kfree_sensitive(ptr); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_KASAN_VMALLOC | ||||
|  |  | |||
|  | @ -1729,17 +1729,17 @@ void *krealloc(const void *p, size_t new_size, gfp_t flags) | |||
| EXPORT_SYMBOL(krealloc); | ||||
| 
 | ||||
| /**
 | ||||
|  * kzfree - like kfree but zero memory | ||||
|  * kfree_sensitive - Clear sensitive information in memory before freeing | ||||
|  * @p: object to free memory of | ||||
|  * | ||||
|  * The memory of the object @p points to is zeroed before freed. | ||||
|  * If @p is %NULL, kzfree() does nothing. | ||||
|  * If @p is %NULL, kfree_sensitive() does nothing. | ||||
|  * | ||||
|  * Note: this function zeroes the whole allocated buffer which can be a good | ||||
|  * deal bigger than the requested buffer size passed to kmalloc(). So be | ||||
|  * careful when using this function in performance sensitive code. | ||||
|  */ | ||||
| void kzfree(const void *p) | ||||
| void kfree_sensitive(const void *p) | ||||
| { | ||||
| 	size_t ks; | ||||
| 	void *mem = (void *)p; | ||||
|  | @ -1750,7 +1750,7 @@ void kzfree(const void *p) | |||
| 	memzero_explicit(mem, ks); | ||||
| 	kfree(mem); | ||||
| } | ||||
| EXPORT_SYMBOL(kzfree); | ||||
| EXPORT_SYMBOL(kfree_sensitive); | ||||
| 
 | ||||
| /**
 | ||||
|  * ksize - get the actual amount of memory allocated for a given object | ||||
|  |  | |||
|  | @ -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 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid) | |||
| 		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 @@ llsec_key_alloc(const struct ieee802154_llsec_key *template) | |||
| 		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; | ||||
| } | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue
	
	 Waiman Long
						Waiman Long