From c838798f0402e12f92d46038ac679bcf97afe040 Mon Sep 17 00:00:00 2001 From: Landon Curt Noll Date: Mon, 29 Nov 2021 01:55:53 -0800 Subject: [PATCH] Fix more memory leaks, improve zfree() action --- zfunc.c | 12 ++++---- zmath.h | 2 +- zmod.c | 83 ++++++++++++++++++++++--------------------------------- zrandom.c | 10 ++++--- 4 files changed, 47 insertions(+), 60 deletions(-) diff --git a/zfunc.c b/zfunc.c index 3906c04..0dff5c0 100644 --- a/zfunc.c +++ b/zfunc.c @@ -1619,7 +1619,7 @@ zfacrem(ZVALUE z1, ZVALUE z2, ZVALUE *rem) long zgcdrem(ZVALUE z1, ZVALUE z2, ZVALUE *res) { - ZVALUE tmp1, tmp2; + ZVALUE tmp1, tmp2, tmp3, tmp4; long count, onecount; long sh; @@ -1663,15 +1663,17 @@ zgcdrem(ZVALUE z1, ZVALUE z2, ZVALUE *res) * the gcd becomes one. */ while (!zisunit(z2)) { - onecount = zfacrem(z1, z2, &tmp1); + onecount = zfacrem(z1, z2, &tmp3); if (onecount) { count += onecount; zfree(z1); - z1 = tmp1; + z1 = tmp3; + } else { + zfree(tmp3); } - zgcd(z1, z2, &tmp1); + zgcd(z1, z2, &tmp4); zfree(z2); - z2 = tmp1; + z2 = tmp4; } zfree(z2); *res = z1; diff --git a/zmath.h b/zmath.h index 1fee438..f97c38c 100644 --- a/zmath.h +++ b/zmath.h @@ -579,7 +579,7 @@ E_FUNC void zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res); #define zcopyval(z1,z2) memcpy((z2).v, (z1).v, (z1).len * sizeof(HALF)) #define zquicktrim(z) {if (((z).len > 1) && ((z).v[(z).len-1] == 0)) \ (z).len--;} -#define zfree(z) freeh((z).v) +#define zfree(z) {if ((z).len != 0 && (z).v != NULL) { freeh((z).v); (z).len = 0; (z).v = NULL; (z).sign = 0; } } /* diff --git a/zmod.c b/zmod.c index 4d075b9..ed00390 100644 --- a/zmod.c +++ b/zmod.c @@ -480,7 +480,7 @@ zmod6(ZVALUE z1, ZVALUE *res) * slightly faster. */ void -zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) +zpowermod(ZVALUE z1_arg, ZVALUE z2, ZVALUE z3, ZVALUE *res) { HALF *hp; /* pointer to current word of the power */ REDC *rp; /* REDC information to be used */ @@ -488,7 +488,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) ZVALUE ans, temp; /* calculation values */ ZVALUE modpow; /* current small power */ ZVALUE lowpowers[POWNUMS]; /* low powers */ - ZVALUE ztmp; + ZVALUE z1; int curshift; /* shift value for word of power */ HALF curhalf; /* current word of power */ unsigned int curpow; /* current low power */ @@ -508,7 +508,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) /* * Check easy cases first. */ - if ((ziszero(z1) && !ziszero(z2)) || zisunit(z3)) { + if ((ziszero(z1_arg) && !ziszero(z2)) || zisunit(z3)) { /* 0^(non_zero) or x^y mod 1 always produces zero */ *res = _zero_; return; @@ -518,13 +518,13 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) return; } if (zistwo(z3)) { /* mod 2 */ - if (zisodd(z1)) + if (zisodd(z1_arg)) *res = _one_; else *res = _zero_; return; } - if (zisunit(z1) && (!z1.sign || ziseven(z2))) { + if (zisunit(z1_arg) && (!z1_arg.sign || ziseven(z2))) { /* 1^x or (-1)^(2x) */ *res = _one_; return; @@ -534,20 +534,18 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) * Normalize the number being raised to be non-negative and to lie * within the modulo range. Then check for zero or one specially. */ - ztmp.len = 0; - if (zisneg(z1) || zrel(z1, z3) >= 0) { - zmod(z1, z3, &ztmp, 0); - z1 = ztmp; + if (zisneg(z1_arg) || zrel(z1_arg, z3) >= 0) { + zmod(z1_arg, z3, &z1, 0); + } else { + zcopy(z1_arg, &z1); } if (ziszero(z1)) { - if (ztmp.len) - zfree(ztmp); + zfree(z1); *res = _zero_; return; } if (zisone(z1)) { - if (ztmp.len) - zfree(ztmp); + zfree(z1); *res = _one_; return; } @@ -575,7 +573,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) pp->v = NULL; } lowpowers[0] = _one_; - lowpowers[1] = z1; + zcopy(z1, &lowpowers[1]); ans = _one_; hp = &z2.v[z2.len - 1]; @@ -666,13 +664,11 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) } } - for (pp = &lowpowers[2]; pp <= &lowpowers[POWNUMS-1]; pp++) { - if (pp->v != NULL) - freeh(pp->v); + for (pp = &lowpowers[1]; pp <= &lowpowers[POWNUMS-1]; pp++) { + zfree(*pp); } *res = ans; - if (ztmp.len) - zfree(ztmp); + zfree(z1); return; } @@ -689,6 +685,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) powermodredc = zredcalloc(z3); rp = powermodredc; zredcencode(rp, z1, &temp); + zfree(z1); zredcpower(rp, temp, z2, &z1); zfree(temp); zredcdecode(rp, z1, res); @@ -705,7 +702,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) pp->v = NULL; } lowpowers[0] = _one_; - lowpowers[1] = z1; + zcopy(z1, &lowpowers[1]); ans = _one_; hp = &z2.v[z2.len - 1]; @@ -747,9 +744,7 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) } } pp = &lowpowers[curpow]; - if (pp->v != NULL) { - zfree(*pp); - } + zfree(*pp); *pp = modpow; } @@ -788,13 +783,12 @@ zpowermod(ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res) } } - for (pp = &lowpowers[2]; pp <= &lowpowers[POWNUMS-1]; pp++) { - if (pp->v != NULL) - freeh(pp->v); + for (pp = &lowpowers[1]; pp <= &lowpowers[POWNUMS-1]; pp++) { + zfree(*pp); } *res = ans; - if (ztmp.len) - zfree(ztmp); + zfree(z1); + return; } /* @@ -1135,8 +1129,7 @@ zredcdecode(REDC *rp, ZVALUE z1, ZVALUE *res) if (ztop.len) { zadd(*res, ztop, &tmp1); zfree(*res); - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); *res = tmp1; } @@ -1504,15 +1497,13 @@ zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res) } if (ziszero(z1)) { *res = _zero_; - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } if ((z1.len == rp->one.len) && (z1.v[0] == rp->one.v[0]) && (zcmp(z1, rp->one) == 0)) { zcopy(z1, res); - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } @@ -1527,8 +1518,7 @@ zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res) zsquare(z1, &tmp); zredcdecode(rp, tmp, res); zfree(tmp); - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } modlen = rp->mod.len; @@ -1633,8 +1623,7 @@ zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res) } res->len = len; if (zrel(*res, rp->mod) < 0) { - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } } @@ -1657,8 +1646,7 @@ zredcsquare(REDC *rp, ZVALUE z1, ZVALUE *res) len--; } res->len = len; - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); } @@ -1717,8 +1705,7 @@ zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res) *res = _one_; else *res = _zero_; - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } if (zcmp(z1, rp->one) == 0) { @@ -1726,8 +1713,7 @@ zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res) zsub(rp->mod, rp->one, res); else zcopy(rp->one, res); - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } @@ -1741,14 +1727,12 @@ zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res) if (zcmp(z1, temp) == 0) { if (zisodd(z2) ^ sign) { *res = temp; - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } zfree(temp); zcopy(rp->one, res); - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); return; } zfree(temp); @@ -1845,8 +1829,7 @@ zredcpower(REDC *rp, ZVALUE z1, ZVALUE z2, ZVALUE *res) } else { *res = ans; } - if (ztmp.len) - zfree(ztmp); + zfree(ztmp); } diff --git a/zrandom.c b/zrandom.c index 0fa485b..674c329 100644 --- a/zrandom.c +++ b/zrandom.c @@ -2296,19 +2296,19 @@ zsrandom1(CONST ZVALUE seed, BOOL need_ret) last_r.v = NULL; do { /* free temp storage */ - if (last_r.v != NULL) { - zfree_random(last_r); - } + zfree_random(last_r); /* * last_r = r; * r = pmod(last_r, 2, n); */ - last_r = r; + zcopy(r, &last_r); + zfree_random(r); zsquaremod(last_r, blum.n, &r); } while (zrel(r, last_r) > 0); zfree_random(blum.r); blum.r = r; + /* free temp storage */ zfree_random(last_r); @@ -3062,6 +3062,7 @@ randomcopy(CONST RANDOM *state) void randomfree(RANDOM *state) { +#if 0 /* avoid free of the pre-defined states */ if (state == &init_blum) { return; @@ -3070,6 +3071,7 @@ randomfree(RANDOM *state) state <= &random_pregen[BLUM_PREGEN-1]) { return; } +#endif /* free the values */ zfree_random(state->n);