Commit 5cd259ca authored by Hongbo Li's avatar Hongbo Li Committed by Herbert Xu
Browse files

crypto: sm2 - fix a memory leak in sm2



SM2 module alloc ec->Q in sm2_set_pub_key(), when doing alg test in
test_akcipher_one(), it will set public key for every test vector,
and don't free ec->Q. This will cause a memory leak.

This patch alloc ec->Q in sm2_ec_ctx_init().

Fixes: ea7ecb66 ("crypto: sm2 - introduce OSCCA SM2 asymmetric cipher algorithm")
Signed-off-by: default avatarHongbo Li <herberthbli@tencent.com>
Reviewed-by: default avatarTianjia Zhang <tianjia.zhang@linux.alibaba.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 9039878a
Loading
Loading
Loading
Loading
+10 −14
Original line number Original line Diff line number Diff line
@@ -79,10 +79,17 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec)
		goto free;
		goto free;


	rc = -ENOMEM;
	rc = -ENOMEM;

	ec->Q = mpi_point_new(0);
	if (!ec->Q)
		goto free;

	/* mpi_ec_setup_elliptic_curve */
	/* mpi_ec_setup_elliptic_curve */
	ec->G = mpi_point_new(0);
	ec->G = mpi_point_new(0);
	if (!ec->G)
	if (!ec->G) {
		mpi_point_release(ec->Q);
		goto free;
		goto free;
	}


	mpi_set(ec->G->x, x);
	mpi_set(ec->G->x, x);
	mpi_set(ec->G->y, y);
	mpi_set(ec->G->y, y);
@@ -91,6 +98,7 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec)
	rc = -EINVAL;
	rc = -EINVAL;
	ec->n = mpi_scanval(ecp->n);
	ec->n = mpi_scanval(ecp->n);
	if (!ec->n) {
	if (!ec->n) {
		mpi_point_release(ec->Q);
		mpi_point_release(ec->G);
		mpi_point_release(ec->G);
		goto free;
		goto free;
	}
	}
@@ -386,27 +394,15 @@ static int sm2_set_pub_key(struct crypto_akcipher *tfm,
	MPI a;
	MPI a;
	int rc;
	int rc;


	ec->Q = mpi_point_new(0);
	if (!ec->Q)
		return -ENOMEM;

	/* include the uncompressed flag '0x04' */
	/* include the uncompressed flag '0x04' */
	rc = -ENOMEM;
	a = mpi_read_raw_data(key, keylen);
	a = mpi_read_raw_data(key, keylen);
	if (!a)
	if (!a)
		goto error;
		return -ENOMEM;


	mpi_normalize(a);
	mpi_normalize(a);
	rc = sm2_ecc_os2ec(ec->Q, a);
	rc = sm2_ecc_os2ec(ec->Q, a);
	mpi_free(a);
	mpi_free(a);
	if (rc)
		goto error;

	return 0;


error:
	mpi_point_release(ec->Q);
	ec->Q = NULL;
	return rc;
	return rc;
}
}