Index: c/cipher/primegen.c =================================================================== --- c/cipher/primegen.c +++ c/cipher/primegen.c @@ -639,14 +639,15 @@ if (g) { /* Create a generator (start with 3). */ - gcry_mpi_t tmp = mpi_alloc (mpi_get_nlimbs (prime)); - gcry_mpi_t b = mpi_alloc (mpi_get_nlimbs (prime)); - gcry_mpi_t pmin1 = mpi_alloc (mpi_get_nlimbs (prime)); if (need_q_factor) err = GPG_ERR_NOT_IMPLEMENTED; else { + gcry_mpi_t tmp = mpi_alloc (mpi_get_nlimbs (prime)); + gcry_mpi_t b = mpi_alloc (mpi_get_nlimbs (prime)); + gcry_mpi_t pmin1 = mpi_alloc (mpi_get_nlimbs (prime)); + factors[n] = q; factors[n + 1] = mpi_alloc_set_ui (2); mpi_sub_ui (pmin1, prime, 1); @@ -1208,17 +1209,25 @@ gcry_mpi_t b = mpi_new (0); gcry_mpi_t pmin1 = mpi_new (0); gcry_mpi_t g = start_g? mpi_copy (start_g) : mpi_set_ui (NULL, 3); + gcry_err_code_t err = 0; int first = 1; int i, n; if (!factors || !r_g || !prime) - return GPG_ERR_INV_ARG; + { + err= GPG_ERR_INV_ARG; + goto leave; + } + *r_g = NULL; for (n=0; factors[n]; n++) ; if (n < 2) - return GPG_ERR_INV_ARG; + { + err= GPG_ERR_INV_ARG; + goto leave; + } /* Extra sanity check - usually disabled. */ /* mpi_set (tmp, factors[0]); */ @@ -1253,9 +1262,18 @@ } while (i < n); +leave: _gcry_mpi_release (tmp); _gcry_mpi_release (b); _gcry_mpi_release (pmin1); + + if (err) + { + _gcry_mpi_release (g); + return err; + + } + *r_g = g; return 0;