Commit 4c21eb57 authored by Graham Leggett's avatar Graham Leggett
Browse files

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
parent 06471fc6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
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
+39 −14
Original line number Diff line number Diff line
@@ -90,12 +90,20 @@ 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);
    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,13 +208,22 @@ 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);

    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,10 +251,18 @@ 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);
    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)
{
+1 −1
Original line number Diff line number Diff line
@@ -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);
+7 −2
Original line number Diff line number Diff line
@@ -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
}

@@ -203,6 +205,9 @@ void util_ald_cache_purge(util_ald_cache_t *cache)
    util_cache_node_t *p, *q;
    apr_time_t t;

    if (!cache)
        return;
  
    cache->last_purge = apr_time_now();
    cache->npurged = 0;
    cache->numpurges++;