From f94ab6feddc9e6bfdc0adafef8dc75dec2bd8ed4 Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Thu, 30 Aug 2001 00:46:25 +0000 Subject: [PATCH] Added some bulletproofing to memory allocation in the LDAP cache 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 | 3 ++ modules/ldap/util_ldap_cache.c | 53 ++++++++++++++++++++++-------- modules/ldap/util_ldap_cache.h | 2 +- modules/ldap/util_ldap_cache_mgr.c | 9 +++-- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/CHANGES b/CHANGES index 93c6800d50..2c79a5d3b5 100644 --- 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 diff --git a/modules/ldap/util_ldap_cache.c b/modules/ldap/util_ldap_cache.c index f8d4a4dc08..9d9844ddd6 100644 --- a/modules/ldap/util_ldap_cache.c +++ b/modules/ldap/util_ldap_cache.c @@ -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) diff --git a/modules/ldap/util_ldap_cache.h b/modules/ldap/util_ldap_cache.h index ea0709887a..18790eb854 100644 --- a/modules/ldap/util_ldap_cache.h +++ b/modules/ldap/util_ldap_cache.h @@ -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); diff --git a/modules/ldap/util_ldap_cache_mgr.c b/modules/ldap/util_ldap_cache_mgr.c index 5921f5fd40..49eece8958 100644 --- a/modules/ldap/util_ldap_cache_mgr.c +++ b/modules/ldap/util_ldap_cache_mgr.c @@ -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; -- 2.50.1