Check output of mpz_set_str and fix leak on error condition
authorest31 <MTest31@outlook.com>
Fri, 24 Jul 2015 19:38:40 +0000 (21:38 +0200)
committerest31 <MTest31@outlook.com>
Fri, 24 Jul 2015 20:42:54 +0000 (22:42 +0200)
Also add static identifier as upstream did

src/util/sha256.c
src/util/srp.cpp

index 311aac4a8aec1a2733ca47cd728c2cebbac9ac1a..4c2bb71a8229b0cb9e1620e44280e07d23e2a437 100644 (file)
@@ -15,8 +15,8 @@
 const char SHA256_version[] = "SHA-256" OPENSSL_VERSION_PTEXT;
 
 /* mem_clr.c */
-unsigned char cleanse_ctr = 0;
-void OPENSSL_cleanse(void *ptr, size_t len)
+unsigned static char cleanse_ctr = 0;
+static void OPENSSL_cleanse(void *ptr, size_t len)
 {
     unsigned char *p = ptr;
     size_t loop = len, ctr = cleanse_ctr;
index 6fafe82807f97f2a8bfce50088ec4d7d76475e09..0d3ddf2789248a9461543cfe093c97c75f719d1b 100644 (file)
@@ -166,6 +166,15 @@ static struct NGHex global_Ng_constants[] = {
 };
 
 
+static void delete_ng(NGConstant *ng)
+{
+       if (ng) {
+               mpz_clear(ng->N);
+               mpz_clear(ng->g);
+               free(ng);
+       }
+}
+
 static NGConstant *new_ng( SRP_NGType ng_type, const char *n_hex, const char *g_hex )
 {
        NGConstant *ng = (NGConstant *) malloc(sizeof(NGConstant));
@@ -180,21 +189,17 @@ static NGConstant *new_ng( SRP_NGType ng_type, const char *n_hex, const char *g_
                g_hex = global_Ng_constants[ ng_type ].g_hex;
        }
 
-       mpz_set_str(ng->N, n_hex, 16);
-       mpz_set_str(ng->g, g_hex, 16);
-
-       return ng;
-}
+       int rv = 0;
+       rv = mpz_set_str(ng->N, n_hex, 16);
+       rv = rv | mpz_set_str(ng->g, g_hex, 16);
 
-static void delete_ng( NGConstant *ng )
-{
-       if (ng) {
-               mpz_clear(ng->N);
-               mpz_clear(ng->g);
-               free(ng);
+       if (rv) {
+               delete_ng(ng);
+               return 0;
        }
-}
 
+       return ng;
+}
 
 
 typedef union
@@ -849,6 +854,8 @@ err_exit:
                mpz_clear(usr->a);
                mpz_clear(usr->A);
                mpz_clear(usr->S);
+               if (usr->ng)
+                       delete_ng(usr->ng);
                if (usr->username)
                        free(usr->username);
                if (usr->username_verifier)