]> granicus.if.org Git - apache/commitdiff
Added some bulletproofing to memory allocation in the LDAP cache
authorGraham Leggett <minfrin@apache.org>
Thu, 30 Aug 2001 00:46:25 +0000 (00:46 +0000)
committerGraham Leggett <minfrin@apache.org>
Thu, 30 Aug 2001 00:46:25 +0000 (00:46 +0000)
code.
PR:
Obtained from:
Submitted by:
Reviewed by:

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@90789 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/ldap/util_ldap_cache.c
modules/ldap/util_ldap_cache.h
modules/ldap/util_ldap_cache_mgr.c

diff --git a/CHANGES b/CHANGES
index 93c6800d50fe1f3d94b5afde53d0b6095a0ae943..2c79a5d3b5c1e19cc4f4baad21d70e876dad58cd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.26-dev
 
+  *) Added some bulletproofing to memory allocation in the LDAP cache
+     code. [Graham Leggett]
+
 Changes with Apache 2.0.25
 
   *) Move the installed /manual directory out of the /htdocs/ tree, so
index f8d4a4dc08ba4ea29547e07c4dcf1a09cdcfdf4c..9d9844ddd6c118a813204b51283f7b62aeac655f 100644 (file)
@@ -90,11 +90,19 @@ void *util_ldap_url_node_copy(void *c)
     util_url_node_t *n = (util_url_node_t *)c;
     util_url_node_t *node = (util_url_node_t *)util_ald_alloc(sizeof(util_url_node_t));
 
-    node->url = util_ald_strdup(n->url);
-    node->search_cache = n->search_cache;
-    node->compare_cache = n->compare_cache;
-    node->dn_compare_cache = n->dn_compare_cache;
-    return node;
+    if (node) {
+        if (!(node->url = util_ald_strdup(n->url))) {
+            util_ald_free(node->url);
+            return NULL;
+        }
+        node->search_cache = n->search_cache;
+        node->compare_cache = n->compare_cache;
+        node->dn_compare_cache = n->dn_compare_cache;
+        return node;
+    }
+    else {
+        return NULL;
+    }
 }
 
 void util_ldap_url_node_free(void *n)
@@ -200,12 +208,21 @@ void *util_ldap_compare_node_copy(void *c)
 {
     util_compare_node_t *n = (util_compare_node_t *)c;
     util_compare_node_t *node = (util_compare_node_t *)util_ald_alloc(sizeof(util_compare_node_t));
-    node->dn = util_ald_strdup(n->dn);
-    node->attrib = util_ald_strdup(n->attrib);
-    node->value = util_ald_strdup(n->value);
-    node->lastcompare = n->lastcompare;
-    node->result = n->result;
-    return node;
+
+    if (node) {
+        if (!(node->dn = util_ald_strdup(n->dn)) ||
+            !(node->attrib = util_ald_strdup(n->attrib)) ||
+            !(node->value = util_ald_strdup(n->value))) {
+            util_ldap_compare_node_free(node);
+            return NULL;
+        }
+        node->lastcompare = n->lastcompare;
+        node->result = n->result;
+        return node;
+    }
+    else {
+        return NULL;
+    }
 }
 
 void util_ldap_compare_node_free(void *n)
@@ -234,9 +251,17 @@ void *util_ldap_dn_compare_node_copy(void *c)
 {
     util_dn_compare_node_t *n = (util_dn_compare_node_t *)c;
     util_dn_compare_node_t *node = (util_dn_compare_node_t *)util_ald_alloc(sizeof(util_dn_compare_node_t));
-    node->reqdn = util_ald_strdup(n->reqdn);
-    node->dn = util_ald_strdup(n->dn);
-    return node;
+    if (node) {
+        if (!(node->reqdn = util_ald_strdup(n->reqdn)) ||
+            !(node->dn = util_ald_strdup(n->dn))) {
+            util_ldap_dn_compare_node_free(node);
+            return NULL;
+        }
+        return node;
+    }
+    else {
+        return NULL;
+    }
 }
 
 void util_ldap_dn_compare_node_free(void *n)
index ea0709887ac517f6134277f5de6ba0800af3fb51..18790eb8544fc349225a601f8c932a8e056a58ca 100644 (file)
@@ -193,7 +193,7 @@ void util_ldap_dn_compare_node_free(void *n);
 /* util_ldap_cache_mgr.c */
 
 void util_ald_free(const void *ptr);
-void *util_ald_alloc(int size);
+void *util_ald_alloc(unsigned long size);
 const char *util_ald_strdup(const char *s);
 unsigned long util_ald_hash_string(int nstr, ...);
 void util_ald_cache_purge(util_ald_cache_t *cache);
index 5921f5fd40e18e2a7ccdfe427bdefea486e7ffa8..49eece895820ca5772942a741e8acdf1789f3869 100644 (file)
@@ -128,8 +128,10 @@ void util_ald_free(const void *ptr)
 #endif
 }
 
-void *util_ald_alloc(int size)
+void *util_ald_alloc(unsigned long size)
 {
+    if (0 == size)
+        return NULL;
 #if APR_HAS_SHARED_MEMORY
     if (util_ldap_shm) {
         return (void *)apr_shm_calloc(util_ldap_shm, size);
@@ -137,7 +139,7 @@ void *util_ald_alloc(int size)
         return (void *)calloc(sizeof(char), size);
     }
 #else
-    return (void *)calloc(size);
+    return (void *)calloc(sizeof(char), size);
 #endif
 }
 
@@ -202,6 +204,9 @@ void util_ald_cache_purge(util_ald_cache_t *cache)
     int i;
     util_cache_node_t *p, *q;
     apr_time_t t;
+
+    if (!cache)
+        return;
   
     cache->last_purge = apr_time_now();
     cache->npurged = 0;