add return value for expand
authormrpre <mrpre@163.com>
Thu, 16 Jun 2016 10:00:38 +0000 (18:00 +0800)
committerRich Salz <rsalz@openssl.org>
Fri, 1 Jul 2016 14:56:19 +0000 (10:56 -0400)
Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/1223)

crypto/lhash/lhash.c

index 3e58eea9c58b49bd89fd08dc6c1c904912e8a44a..1ca4289e05aac734d8075d3d7c754eba620be0bb 100644 (file)
@@ -20,7 +20,7 @@
 #define UP_LOAD         (2*LH_LOAD_MULT) /* load times 256 (default 2) */
 #define DOWN_LOAD       (LH_LOAD_MULT) /* load times 256 (default 1) */
 
 #define UP_LOAD         (2*LH_LOAD_MULT) /* load times 256 (default 2) */
 #define DOWN_LOAD       (LH_LOAD_MULT) /* load times 256 (default 1) */
 
-static void expand(OPENSSL_LHASH *lh);
+static int expand(OPENSSL_LHASH *lh);
 static void contract(OPENSSL_LHASH *lh);
 static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh, const void *data, unsigned long *rhash);
 
 static void contract(OPENSSL_LHASH *lh);
 static OPENSSL_LH_NODE **getrn(OPENSSL_LHASH *lh, const void *data, unsigned long *rhash);
 
@@ -72,11 +72,17 @@ void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data)
     unsigned long hash;
     OPENSSL_LH_NODE *nn, **rn;
     void *ret;
     unsigned long hash;
     OPENSSL_LH_NODE *nn, **rn;
     void *ret;
-
+    int val = 0;
+    
     lh->error = 0;
     if (lh->up_load <= (lh->num_items * LH_LOAD_MULT / lh->num_nodes))
     lh->error = 0;
     if (lh->up_load <= (lh->num_items * LH_LOAD_MULT / lh->num_nodes))
-        expand(lh);
-
+        val = expand(lh);
+    
+    if(val){
+        lh->error++;
+        return (NULL);
+    }
+        
     rn = getrn(lh, data, &hash);
 
     if (*rn == NULL) {
     rn = getrn(lh, data, &hash);
 
     if (*rn == NULL) {
@@ -184,7 +190,7 @@ void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void
     doall_util_fn(lh, 1, (OPENSSL_LH_DOALL_FUNC)0, func, arg);
 }
 
     doall_util_fn(lh, 1, (OPENSSL_LH_DOALL_FUNC)0, func, arg);
 }
 
-static void expand(OPENSSL_LHASH *lh)
+static int expand(OPENSSL_LHASH *lh)
 {
     OPENSSL_LH_NODE **n, **n1, **n2, *np;
     unsigned int p, i, j;
 {
     OPENSSL_LH_NODE **n, **n1, **n2, *np;
     unsigned int p, i, j;
@@ -216,7 +222,7 @@ static void expand(OPENSSL_LHASH *lh)
             /* fputs("realloc error in lhash",stderr); */
             lh->error++;
             lh->p = 0;
             /* fputs("realloc error in lhash",stderr); */
             lh->error++;
             lh->p = 0;
-            return;
+            return -1;
         }
         for (i = (int)lh->num_alloc_nodes; i < j; i++) /* 26/02/92 eay */
             n[i] = NULL;        /* 02/03/92 eay */
         }
         for (i = (int)lh->num_alloc_nodes; i < j; i++) /* 26/02/92 eay */
             n[i] = NULL;        /* 02/03/92 eay */
@@ -226,6 +232,7 @@ static void expand(OPENSSL_LHASH *lh)
         lh->p = 0;
         lh->b = n;
     }
         lh->p = 0;
         lh->b = n;
     }
+    return 0;
 }
 
 static void contract(OPENSSL_LHASH *lh)
 }
 
 static void contract(OPENSSL_LHASH *lh)