Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Pull crypto fixes from Herbert Xu:
 "This fixes two memory leaks and a list corruption bug"

* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
  crypto: user - prevent operating on larval algorithms
  crypto: cryptd - Fix skcipher instance memory leak
  lib/mpi: Fix karactx leak in mpi_powm
This commit is contained in:
Linus Torvalds 2019-07-05 13:31:19 +09:00
commit ee39d46dca
3 changed files with 6 additions and 4 deletions

View File

@ -388,6 +388,7 @@ static void cryptd_skcipher_free(struct skcipher_instance *inst)
struct skcipherd_instance_ctx *ctx = skcipher_instance_ctx(inst); struct skcipherd_instance_ctx *ctx = skcipher_instance_ctx(inst);
crypto_drop_skcipher(&ctx->spawn); crypto_drop_skcipher(&ctx->spawn);
kfree(inst);
} }
static int cryptd_create_skcipher(struct crypto_template *tmpl, static int cryptd_create_skcipher(struct crypto_template *tmpl,

View File

@ -44,6 +44,9 @@ struct crypto_alg *crypto_alg_match(struct crypto_user_alg *p, int exact)
list_for_each_entry(q, &crypto_alg_list, cra_list) { list_for_each_entry(q, &crypto_alg_list, cra_list) {
int match = 0; int match = 0;
if (crypto_is_larval(q))
continue;
if ((q->cra_flags ^ p->cru_type) & p->cru_mask) if ((q->cra_flags ^ p->cru_type) & p->cru_mask)
continue; continue;

View File

@ -24,6 +24,7 @@
int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
{ {
mpi_ptr_t mp_marker = NULL, bp_marker = NULL, ep_marker = NULL; mpi_ptr_t mp_marker = NULL, bp_marker = NULL, ep_marker = NULL;
struct karatsuba_ctx karactx = {};
mpi_ptr_t xp_marker = NULL; mpi_ptr_t xp_marker = NULL;
mpi_ptr_t tspace = NULL; mpi_ptr_t tspace = NULL;
mpi_ptr_t rp, ep, mp, bp; mpi_ptr_t rp, ep, mp, bp;
@ -150,13 +151,11 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
int c; int c;
mpi_limb_t e; mpi_limb_t e;
mpi_limb_t carry_limb; mpi_limb_t carry_limb;
struct karatsuba_ctx karactx;
xp = xp_marker = mpi_alloc_limb_space(2 * (msize + 1)); xp = xp_marker = mpi_alloc_limb_space(2 * (msize + 1));
if (!xp) if (!xp)
goto enomem; goto enomem;
memset(&karactx, 0, sizeof karactx);
negative_result = (ep[0] & 1) && base->sign; negative_result = (ep[0] & 1) && base->sign;
i = esize - 1; i = esize - 1;
@ -281,8 +280,6 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
if (mod_shift_cnt) if (mod_shift_cnt)
mpihelp_rshift(rp, rp, rsize, mod_shift_cnt); mpihelp_rshift(rp, rp, rsize, mod_shift_cnt);
MPN_NORMALIZE(rp, rsize); MPN_NORMALIZE(rp, rsize);
mpihelp_release_karatsuba_ctx(&karactx);
} }
if (negative_result && rsize) { if (negative_result && rsize) {
@ -299,6 +296,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
leave: leave:
rc = 0; rc = 0;
enomem: enomem:
mpihelp_release_karatsuba_ctx(&karactx);
if (assign_rp) if (assign_rp)
mpi_assign_limb_space(res, rp, size); mpi_assign_limb_space(res, rp, size);
if (mp_marker) if (mp_marker)