From: Heiko Stuebner <[email protected]>

n, rr and rrtmp are used for internal calculations, but in the end
the results are copied into separately allocated elements of the
actual key_prop, so the n, rr and rrtmp elements are not used anymore
when returning from the function and should of course be freed.

Signed-off-by: Heiko Stuebner <[email protected]>
---
changes in v4:
- new patch

 lib/rsa/rsa-keyprop.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/lib/rsa/rsa-keyprop.c b/lib/rsa/rsa-keyprop.c
index 83b942615f..195ce30181 100644
--- a/lib/rsa/rsa-keyprop.c
+++ b/lib/rsa/rsa-keyprop.c
@@ -654,17 +654,17 @@ int rsa_gen_key_prop(const void *key, uint32_t keylen, 
struct key_prop **prop)
 {
        struct rsa_key rsa_key;
        uint32_t *n = NULL, *rr = NULL, *rrtmp = NULL;
-       int rlen, i, ret;
+       int rlen, i, ret = 0;
 
        *prop = calloc(sizeof(**prop), 1);
        if (!(*prop)) {
                ret = -ENOMEM;
-               goto err;
+               goto out;
        }
 
        ret = rsa_parse_pub_key(&rsa_key, key, keylen);
        if (ret)
-               goto err;
+               goto out;
 
        /* modulus */
        /* removing leading 0's */
@@ -674,7 +674,7 @@ int rsa_gen_key_prop(const void *key, uint32_t keylen, 
struct key_prop **prop)
        (*prop)->modulus = malloc(rsa_key.n_sz - i);
        if (!(*prop)->modulus) {
                ret = -ENOMEM;
-               goto err;
+               goto out;
        }
        memcpy((void *)(*prop)->modulus, &rsa_key.n[i], rsa_key.n_sz - i);
 
@@ -690,7 +690,7 @@ int rsa_gen_key_prop(const void *key, uint32_t keylen, 
struct key_prop **prop)
        (*prop)->public_exponent = calloc(1, sizeof(uint64_t));
        if (!(*prop)->public_exponent) {
                ret = -ENOMEM;
-               goto err;
+               goto out;
        }
        memcpy((void *)(*prop)->public_exponent + sizeof(uint64_t)
                                                - rsa_key.e_sz,
@@ -714,16 +714,15 @@ int rsa_gen_key_prop(const void *key, uint32_t keylen, 
struct key_prop **prop)
        (*prop)->rr = malloc(rlen);
        if (!(*prop)->rr) {
                ret = -ENOMEM;
-               goto err;
+               goto out;
        }
        br_i32_encode((void *)(*prop)->rr, rlen, rr);
 
-       return 0;
-
-err:
+out:
        free(n);
        free(rr);
        free(rrtmp);
-       rsa_free_key_prop(*prop);
+       if (ret < 0)
+               rsa_free_key_prop(*prop);
        return ret;
 }
-- 
2.26.2

Reply via email to