New snapshot for Michael Fromberger, lets see if this corrupts memory

less.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20759 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-05-31 23:24:37 +00:00
parent 349d49a313
commit 3067c89d6c

View File

@@ -4,7 +4,7 @@
Author: M. J. Fromberger <http://www.dartmouth.edu/~sting/>
Info: $Id$
Copyright (C) 2002 Michael J. Fromberger, All Rights Reserved.
Copyright (C) 2002-2007 Michael J. Fromberger, All Rights Reserved.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
@@ -39,6 +39,10 @@
#include <assert.h>
#if DEBUG
#define static
#endif
/* {{{ Constants */
const mp_result MP_OK = 0; /* no error, all is well */
@@ -182,15 +186,13 @@ static const mp_size multiply_threshold = MP_MULT_THRESH;
/* Allocate a buffer of (at least) num digits, or return
NULL if that couldn't be done. */
static mp_digit *s_alloc(mp_size num);
#if TRACEABLE_FREE
/* Release a buffer of digits allocated by s_alloc(). */
static void s_free(void *ptr);
#else
#define s_free(P) free(P)
#endif
/* Insure that z has at least min digits allocated, resizing if
necessary. Returns true if successful, false if out of memory. */
int s_pad(mp_int z, mp_size min);
static int s_pad(mp_int z, mp_size min);
/* Normalize by removing leading zeroes (except when z = 0) */
#if TRACEABLE_CLAMP
@@ -456,7 +458,7 @@ void mp_int_free(mp_int z)
NRCHECK(z != NULL);
mp_int_clear(z);
free(z);
free(z); /* note: NOT s_free() */
}
/* }}} */
@@ -976,7 +978,6 @@ mp_result mp_int_mod(mp_int a, mp_int m, mp_int c)
/* }}} */
/* {{{ mp_int_div_value(a, value, q, r) */
mp_result mp_int_div_value(mp_int a, int value, mp_int q, int *r)
@@ -2017,20 +2018,38 @@ static mp_digit *s_alloc(mp_size num)
mp_digit *out = malloc(num * sizeof(mp_digit));
assert(out != NULL); /* for debugging */
#if DEBUG > 1
{
mp_digit v = (mp_digit) 0xdeadbeef;
int ix;
for(ix = 0; ix < num; ++ix)
out[ix] = v;
}
#endif
return out;
}
/* }}} */
/* {{{ s_realloc(old, num) */
/* {{{ s_realloc(old, osize, nsize) */
static mp_digit *s_realloc(mp_digit *old, mp_size num)
static mp_digit *s_realloc(mp_digit *old, mp_size osize, mp_size nsize)
{
mp_digit *new = realloc(old, num * sizeof(mp_digit));
#if DEBUG > 1
mp_digit *new = s_alloc(nsize);
int ix;
for(ix = 0; ix < nsize; ++ix)
new[ix] = (mp_digit) 0xdeadbeef;
memcpy(new, old, osize * sizeof(mp_digit));
#else
mp_digit *new = realloc(old, nsize * sizeof(mp_digit));
assert(new != NULL); /* for debugging */
#endif
return new;
}
@@ -2038,18 +2057,16 @@ static mp_digit *s_realloc(mp_digit *old, mp_size num)
/* {{{ s_free(ptr) */
#if TRACEABLE_FREE
static void s_free(void *ptr)
{
free(ptr);
}
#endif
/* }}} */
/* {{{ s_pad(z, min) */
int s_pad(mp_int z, mp_size min)
static int s_pad(mp_int z, mp_size min)
{
if(MP_ALLOC(z) < min) {
mp_size nsize = ROUND_PREC(min);
@@ -2061,7 +2078,7 @@ int s_pad(mp_int z, mp_size min)
COPY(MP_DIGITS(z), tmp, MP_USED(z));
}
else if((tmp = s_realloc(MP_DIGITS(z), nsize)) == NULL)
else if((tmp = s_realloc(MP_DIGITS(z), MP_ALLOC(z), nsize)) == NULL)
return 0;
MP_DIGITS(z) = tmp;
@@ -2409,7 +2426,7 @@ static int s_ksqr(mp_digit *da, mp_digit *dc, mp_size size_a)
(void) s_uadd(t2, dc + 2*bot_size, dc + 2*bot_size,
buf_size, buf_size);
free(t1); /* note that t2 and t2 are internal pointers only */
s_free(t1); /* note that t2 and t2 are internal pointers only */
}
else {
@@ -2706,7 +2723,9 @@ static int s_qmul(mp_int z, mp_size p2)
/* {{{ s_qsub(z, p2) */
/* Subtract |z| from 2^p2, assuming 2^p2 > |z|, and set z to be positive */
/* Compute z = 2^p2 - |z|; requires that 2^p2 >= |z|
The sign of the result is always zero/positive.
*/
static int s_qsub(mp_int z, mp_size p2)
{
mp_digit hi = (1 << (p2 % MP_DIGIT_BIT)), *zp;
@@ -2884,10 +2903,11 @@ static int s_reduce(mp_int x, mp_int m, mp_int mu, mp_int q1, mp_int q2)
/* If x > m, we need to back it off until it is in range.
This will be required at most twice. */
if(mp_int_compare(x, m) >= 0)
if(mp_int_compare(x, m) >= 0) {
(void) mp_int_sub(x, m, x);
if(mp_int_compare(x, m) >= 0)
(void) mp_int_sub(x, m, x);
}
/* At this point, x has been properly reduced. */
return 1;
@@ -2908,8 +2928,10 @@ static mp_result s_embar(mp_int a, mp_int b, mp_int m, mp_int mu, mp_int c)
umu = MP_USED(mu); db = MP_DIGITS(b); dbt = db + MP_USED(b) - 1;
while(last < 3)
while(last < 3) {
SETUP(mp_int_init_size(TEMP(last), 4 * umu), last);
ZERO(MP_DIGITS(TEMP(last - 1)), MP_ALLOC(TEMP(last - 1)));
}
(void) mp_int_set_value(c, 1);