Skip to content

Commit 453431a

Browse files
Waiman-Longtorvalds
authored andcommitted
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. [[email protected]: fs/crypto/inline_crypt.c needs linux/slab.h] [[email protected]: fix fs/crypto/inline_crypt.c some more] Suggested-by: Joe Perches <[email protected]> Signed-off-by: Waiman Long <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Acked-by: David Howells <[email protected]> Acked-by: Michal Hocko <[email protected]> Acked-by: Johannes Weiner <[email protected]> Cc: Jarkko Sakkinen <[email protected]> Cc: James Morris <[email protected]> Cc: "Serge E. Hallyn" <[email protected]> Cc: Joe Perches <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: David Rientjes <[email protected]> Cc: Dan Carpenter <[email protected]> Cc: "Jason A . Donenfeld" <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 57c720d commit 453431a

File tree

114 files changed

+323
-320
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+323
-320
lines changed

arch/s390/crypto/prng.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ static void prng_tdes_deinstantiate(void)
249249
{
250250
pr_debug("The prng module stopped "
251251
"after running in triple DES mode\n");
252-
kzfree(prng_data);
252+
kfree_sensitive(prng_data);
253253
}
254254

255255

@@ -442,7 +442,7 @@ static int __init prng_sha512_instantiate(void)
442442
static void prng_sha512_deinstantiate(void)
443443
{
444444
pr_debug("The prng module stopped after running in SHA-512 mode\n");
445-
kzfree(prng_data);
445+
kfree_sensitive(prng_data);
446446
}
447447

448448

arch/x86/power/hibernate.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static int get_e820_md5(struct e820_table *table, void *buf)
9898
if (crypto_shash_digest(desc, (u8 *)table, size, buf))
9999
ret = -EINVAL;
100100

101-
kzfree(desc);
101+
kfree_sensitive(desc);
102102

103103
free_tfm:
104104
crypto_free_shash(tfm);

crypto/adiantum.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ static int adiantum_setkey(struct crypto_skcipher *tfm, const u8 *key,
177177
keyp += NHPOLY1305_KEY_SIZE;
178178
WARN_ON(keyp != &data->derived_keys[ARRAY_SIZE(data->derived_keys)]);
179179
out:
180-
kzfree(data);
180+
kfree_sensitive(data);
181181
return err;
182182
}
183183

crypto/ahash.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static int ahash_setkey_unaligned(struct crypto_ahash *tfm, const u8 *key,
183183
alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
184184
memcpy(alignbuffer, key, keylen);
185185
ret = tfm->setkey(tfm, alignbuffer, keylen);
186-
kzfree(buffer);
186+
kfree_sensitive(buffer);
187187
return ret;
188188
}
189189

@@ -302,7 +302,7 @@ static void ahash_restore_req(struct ahash_request *req, int err)
302302
req->priv = NULL;
303303

304304
/* Free the req->priv.priv from the ADJUSTED request. */
305-
kzfree(priv);
305+
kfree_sensitive(priv);
306306
}
307307

308308
static void ahash_notify_einprogress(struct ahash_request *req)

crypto/api.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
571571
alg->cra_exit(tfm);
572572
crypto_exit_ops(tfm);
573573
crypto_mod_put(alg);
574-
kzfree(mem);
574+
kfree_sensitive(mem);
575575
}
576576
EXPORT_SYMBOL_GPL(crypto_destroy_tfm);
577577

crypto/asymmetric_keys/verify_pefile.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ static int pefile_digest_pe(const void *pebuf, unsigned int pelen,
376376
}
377377

378378
error:
379-
kzfree(desc);
379+
kfree_sensitive(desc);
380380
error_no_desc:
381381
crypto_free_shash(tfm);
382382
kleave(" = %d", ret);
@@ -447,6 +447,6 @@ int verify_pefile_signature(const void *pebuf, unsigned pelen,
447447
ret = pefile_digest_pe(pebuf, pelen, &ctx);
448448

449449
error:
450-
kzfree(ctx.digest);
450+
kfree_sensitive(ctx.digest);
451451
return ret;
452452
}

crypto/deflate.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ static void __deflate_exit(void *ctx)
163163
static void deflate_free_ctx(struct crypto_scomp *tfm, void *ctx)
164164
{
165165
__deflate_exit(ctx);
166-
kzfree(ctx);
166+
kfree_sensitive(ctx);
167167
}
168168

169169
static void deflate_exit(struct crypto_tfm *tfm)

crypto/drbg.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -1218,19 +1218,19 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg)
12181218
{
12191219
if (!drbg)
12201220
return;
1221-
kzfree(drbg->Vbuf);
1221+
kfree_sensitive(drbg->Vbuf);
12221222
drbg->Vbuf = NULL;
12231223
drbg->V = NULL;
1224-
kzfree(drbg->Cbuf);
1224+
kfree_sensitive(drbg->Cbuf);
12251225
drbg->Cbuf = NULL;
12261226
drbg->C = NULL;
1227-
kzfree(drbg->scratchpadbuf);
1227+
kfree_sensitive(drbg->scratchpadbuf);
12281228
drbg->scratchpadbuf = NULL;
12291229
drbg->reseed_ctr = 0;
12301230
drbg->d_ops = NULL;
12311231
drbg->core = NULL;
12321232
if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
1233-
kzfree(drbg->prev);
1233+
kfree_sensitive(drbg->prev);
12341234
drbg->prev = NULL;
12351235
drbg->fips_primed = false;
12361236
}
@@ -1701,7 +1701,7 @@ static int drbg_fini_hash_kernel(struct drbg_state *drbg)
17011701
struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
17021702
if (sdesc) {
17031703
crypto_free_shash(sdesc->shash.tfm);
1704-
kzfree(sdesc);
1704+
kfree_sensitive(sdesc);
17051705
}
17061706
drbg->priv_data = NULL;
17071707
return 0;

crypto/ecc.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static u64 *ecc_alloc_digits_space(unsigned int ndigits)
6767

6868
static void ecc_free_digits_space(u64 *space)
6969
{
70-
kzfree(space);
70+
kfree_sensitive(space);
7171
}
7272

7373
static struct ecc_point *ecc_alloc_point(unsigned int ndigits)
@@ -101,9 +101,9 @@ static void ecc_free_point(struct ecc_point *p)
101101
if (!p)
102102
return;
103103

104-
kzfree(p->x);
105-
kzfree(p->y);
106-
kzfree(p);
104+
kfree_sensitive(p->x);
105+
kfree_sensitive(p->y);
106+
kfree_sensitive(p);
107107
}
108108

109109
static void vli_clear(u64 *vli, unsigned int ndigits)

crypto/ecdh.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static int ecdh_compute_value(struct kpp_request *req)
124124

125125
/* fall through */
126126
free_all:
127-
kzfree(shared_secret);
127+
kfree_sensitive(shared_secret);
128128
free_pubkey:
129129
kfree(public_key);
130130
return ret;

crypto/gcm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
139139
CRYPTO_TFM_REQ_MASK);
140140
err = crypto_ahash_setkey(ghash, (u8 *)&data->hash, sizeof(be128));
141141
out:
142-
kzfree(data);
142+
kfree_sensitive(data);
143143
return err;
144144
}
145145

crypto/gf128mul.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,8 @@ void gf128mul_free_64k(struct gf128mul_64k *t)
304304
int i;
305305

306306
for (i = 0; i < 16; i++)
307-
kzfree(t->t[i]);
308-
kzfree(t);
307+
kfree_sensitive(t->t[i]);
308+
kfree_sensitive(t);
309309
}
310310
EXPORT_SYMBOL(gf128mul_free_64k);
311311

crypto/jitterentropy-kcapi.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void *jent_zalloc(unsigned int len)
5757

5858
void jent_zfree(void *ptr)
5959
{
60-
kzfree(ptr);
60+
kfree_sensitive(ptr);
6161
}
6262

6363
int jent_fips_enabled(void)

crypto/rng.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ int crypto_rng_reset(struct crypto_rng *tfm, const u8 *seed, unsigned int slen)
5353
err = crypto_rng_alg(tfm)->seed(tfm, seed, slen);
5454
crypto_stats_rng_seed(alg, err);
5555
out:
56-
kzfree(buf);
56+
kfree_sensitive(buf);
5757
return err;
5858
}
5959
EXPORT_SYMBOL_GPL(crypto_rng_reset);

crypto/rsa-pkcs1pad.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ static int pkcs1pad_encrypt_sign_complete(struct akcipher_request *req, int err)
199199
sg_copy_from_buffer(req->dst,
200200
sg_nents_for_len(req->dst, ctx->key_size),
201201
out_buf, ctx->key_size);
202-
kzfree(out_buf);
202+
kfree_sensitive(out_buf);
203203

204204
out:
205205
req->dst_len = ctx->key_size;
@@ -322,7 +322,7 @@ static int pkcs1pad_decrypt_complete(struct akcipher_request *req, int err)
322322
out_buf + pos, req->dst_len);
323323

324324
done:
325-
kzfree(req_ctx->out_buf);
325+
kfree_sensitive(req_ctx->out_buf);
326326

327327
return err;
328328
}
@@ -500,7 +500,7 @@ static int pkcs1pad_verify_complete(struct akcipher_request *req, int err)
500500
req->dst_len) != 0)
501501
err = -EKEYREJECTED;
502502
done:
503-
kzfree(req_ctx->out_buf);
503+
kfree_sensitive(req_ctx->out_buf);
504504

505505
return err;
506506
}

crypto/seqiv.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static void seqiv_aead_encrypt_complete2(struct aead_request *req, int err)
3333
memcpy(req->iv, subreq->iv, crypto_aead_ivsize(geniv));
3434

3535
out:
36-
kzfree(subreq->iv);
36+
kfree_sensitive(subreq->iv);
3737
}
3838

3939
static void seqiv_aead_encrypt_complete(struct crypto_async_request *base,

crypto/shash.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key,
4444
alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
4545
memcpy(alignbuffer, key, keylen);
4646
err = shash->setkey(tfm, alignbuffer, keylen);
47-
kzfree(buffer);
47+
kfree_sensitive(buffer);
4848
return err;
4949
}
5050

crypto/skcipher.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ static int skcipher_setkey_unaligned(struct crypto_skcipher *tfm,
592592
alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
593593
memcpy(alignbuffer, key, keylen);
594594
ret = cipher->setkey(tfm, alignbuffer, keylen);
595-
kzfree(buffer);
595+
kfree_sensitive(buffer);
596596
return ret;
597597
}
598598

crypto/testmgr.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1744,7 +1744,7 @@ static int test_hash_vs_generic_impl(const char *driver,
17441744
kfree(vec.plaintext);
17451745
kfree(vec.digest);
17461746
crypto_free_shash(generic_tfm);
1747-
kzfree(generic_desc);
1747+
kfree_sensitive(generic_desc);
17481748
return err;
17491749
}
17501750
#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */
@@ -3665,7 +3665,7 @@ static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
36653665
if (IS_ERR(drng)) {
36663666
printk(KERN_ERR "alg: drbg: could not allocate DRNG handle for "
36673667
"%s\n", driver);
3668-
kzfree(buf);
3668+
kfree_sensitive(buf);
36693669
return -ENOMEM;
36703670
}
36713671

@@ -3712,7 +3712,7 @@ static int drbg_cavs_test(const struct drbg_testvec *test, int pr,
37123712

37133713
outbuf:
37143714
crypto_free_rng(drng);
3715-
kzfree(buf);
3715+
kfree_sensitive(buf);
37163716
return ret;
37173717
}
37183718

crypto/zstd.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static void __zstd_exit(void *ctx)
137137
static void zstd_free_ctx(struct crypto_scomp *tfm, void *ctx)
138138
{
139139
__zstd_exit(ctx);
140-
kzfree(ctx);
140+
kfree_sensitive(ctx);
141141
}
142142

143143
static void zstd_exit(struct crypto_tfm *tfm)

drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static int sun8i_ce_cipher(struct skcipher_request *areq)
254254
offset = areq->cryptlen - ivsize;
255255
if (rctx->op_dir & CE_DECRYPTION) {
256256
memcpy(areq->iv, backup_iv, ivsize);
257-
kzfree(backup_iv);
257+
kfree_sensitive(backup_iv);
258258
} else {
259259
scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
260260
ivsize, 0);

drivers/crypto/allwinner/sun8i-ss/sun8i-ss-cipher.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ static int sun8i_ss_cipher(struct skcipher_request *areq)
249249
if (rctx->op_dir & SS_DECRYPTION) {
250250
memcpy(areq->iv, backup_iv, ivsize);
251251
memzero_explicit(backup_iv, ivsize);
252-
kzfree(backup_iv);
252+
kfree_sensitive(backup_iv);
253253
} else {
254254
scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
255255
ivsize, 0);

drivers/crypto/amlogic/amlogic-gxl-cipher.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,8 @@ static int meson_cipher(struct skcipher_request *areq)
252252
}
253253
}
254254
theend:
255-
kzfree(bkeyiv);
256-
kzfree(backup_iv);
255+
kfree_sensitive(bkeyiv);
256+
kfree_sensitive(backup_iv);
257257

258258
return err;
259259
}

drivers/crypto/atmel-ecc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static void atmel_ecdh_done(struct atmel_i2c_work_data *work_data, void *areq,
6969

7070
/* fall through */
7171
free_work_data:
72-
kzfree(work_data);
72+
kfree_sensitive(work_data);
7373
kpp_request_complete(req, status);
7474
}
7575

drivers/crypto/caam/caampkc.c

+14-14
Original file line numberDiff line numberDiff line change
@@ -854,14 +854,14 @@ static int caam_rsa_dec(struct akcipher_request *req)
854854

855855
static void caam_rsa_free_key(struct caam_rsa_key *key)
856856
{
857-
kzfree(key->d);
858-
kzfree(key->p);
859-
kzfree(key->q);
860-
kzfree(key->dp);
861-
kzfree(key->dq);
862-
kzfree(key->qinv);
863-
kzfree(key->tmp1);
864-
kzfree(key->tmp2);
857+
kfree_sensitive(key->d);
858+
kfree_sensitive(key->p);
859+
kfree_sensitive(key->q);
860+
kfree_sensitive(key->dp);
861+
kfree_sensitive(key->dq);
862+
kfree_sensitive(key->qinv);
863+
kfree_sensitive(key->tmp1);
864+
kfree_sensitive(key->tmp2);
865865
kfree(key->e);
866866
kfree(key->n);
867867
memset(key, 0, sizeof(*key));
@@ -1018,17 +1018,17 @@ static void caam_rsa_set_priv_key_form(struct caam_rsa_ctx *ctx,
10181018
return;
10191019

10201020
free_dq:
1021-
kzfree(rsa_key->dq);
1021+
kfree_sensitive(rsa_key->dq);
10221022
free_dp:
1023-
kzfree(rsa_key->dp);
1023+
kfree_sensitive(rsa_key->dp);
10241024
free_tmp2:
1025-
kzfree(rsa_key->tmp2);
1025+
kfree_sensitive(rsa_key->tmp2);
10261026
free_tmp1:
1027-
kzfree(rsa_key->tmp1);
1027+
kfree_sensitive(rsa_key->tmp1);
10281028
free_q:
1029-
kzfree(rsa_key->q);
1029+
kfree_sensitive(rsa_key->q);
10301030
free_p:
1031-
kzfree(rsa_key->p);
1031+
kfree_sensitive(rsa_key->p);
10321032
}
10331033

10341034
static int caam_rsa_set_priv_key(struct crypto_akcipher *tfm, const void *key,

drivers/crypto/cavium/cpt/cptvf_main.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static void cleanup_worker_threads(struct cpt_vf *cptvf)
7474
for (i = 0; i < cptvf->nr_queues; i++)
7575
tasklet_kill(&cwqe_info->vq_wqe[i].twork);
7676

77-
kzfree(cwqe_info);
77+
kfree_sensitive(cwqe_info);
7878
cptvf->wqe_info = NULL;
7979
}
8080

@@ -88,7 +88,7 @@ static void free_pending_queues(struct pending_qinfo *pqinfo)
8888
continue;
8989

9090
/* free single queue */
91-
kzfree((queue->head));
91+
kfree_sensitive((queue->head));
9292

9393
queue->front = 0;
9494
queue->rear = 0;
@@ -189,7 +189,7 @@ static void free_command_queues(struct cpt_vf *cptvf,
189189
chunk->head = NULL;
190190
chunk->dma_addr = 0;
191191
hlist_del(&chunk->nextchunk);
192-
kzfree(chunk);
192+
kfree_sensitive(chunk);
193193
}
194194

195195
queue->nchunks = 0;

0 commit comments

Comments
 (0)