Commit d6c6f8c3ccfe9b572eddca79fba74a2c910571a2

Steffen Jaeckel 2019-04-04T12:38:36

use `calloc` so we don't have to zero the digits ourself this also has the nice side-effect that potential multiplication overflows in `mp_init_size` are now eliminiated

diff --git a/bn_mp_init.c b/bn_mp_init.c
index 3c0c489..29af64b 100644
--- a/bn_mp_init.c
+++ b/bn_mp_init.c
@@ -15,19 +15,12 @@
 /* init a new mp_int */
 int mp_init(mp_int *a)
 {
-   int i;
-
    /* allocate memory required and clear it */
-   a->dp = (mp_digit *) XMALLOC(MP_PREC * sizeof(mp_digit));
+   a->dp = (mp_digit *) XCALLOC((size_t)MP_PREC, sizeof(mp_digit));
    if (a->dp == NULL) {
       return MP_MEM;
    }
 
-   /* set the digits to zero */
-   for (i = 0; i < MP_PREC; i++) {
-      a->dp[i] = 0;
-   }
-
    /* set the used to zero, allocated digits to the default precision
     * and sign to positive */
    a->used  = 0;
diff --git a/bn_mp_init_size.c b/bn_mp_init_size.c
index 1becb23..1545842 100644
--- a/bn_mp_init_size.c
+++ b/bn_mp_init_size.c
@@ -15,13 +15,11 @@
 /* init an mp_init for a given size */
 int mp_init_size(mp_int *a, int size)
 {
-   int x;
-
    /* pad size so there are always extra digits */
    size += (MP_PREC * 2) - (size % MP_PREC);
 
    /* alloc mem */
-   a->dp = (mp_digit *) XMALLOC((size_t)size * sizeof(mp_digit));
+   a->dp = (mp_digit *) XCALLOC((size_t)size, sizeof(mp_digit));
    if (a->dp == NULL) {
       return MP_MEM;
    }
@@ -31,11 +29,6 @@ int mp_init_size(mp_int *a, int size)
    a->alloc = size;
    a->sign  = MP_ZPOS;
 
-   /* zero the digits */
-   for (x = 0; x < size; x++) {
-      a->dp[x] = 0;
-   }
-
    return MP_OKAY;
 }
 #endif