From: Bradley Nicholes Date: Wed, 9 Mar 2005 00:15:01 +0000 (+0000) Subject: Keep track of the number of attributes retrieved from LDAP so that all the values... X-Git-Tag: 2.1.4~12 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a92c5fa98cc822c1e6517b50685611907d0fdf41;p=apache Keep track of the number of attributes retrieved from LDAP so that all the values can be properly cached even if the value is NULL. [PR 33901] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@156587 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index a27be68a79..7ef5afd99b 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.1.4 [Remove entries to the current 2.0 section below, when backported] + *) util_ldap: Keep track of the number of attributes retrieved from + LDAP so that all the values can be properly cached even if the + value is NULL. PR 33901 [Brad Nicholes] + *) mod_cache: Fix error where incoming Cache-Control would be ignored. [Justin Erenkrantz] diff --git a/modules/ldap/util_ldap.c b/modules/ldap/util_ldap.c index 3a561fa85c..18fd26abd5 100644 --- a/modules/ldap/util_ldap.c +++ b/modules/ldap/util_ldap.c @@ -815,6 +815,7 @@ LDAP_DECLARE(int) util_ldap_cache_checkuserid(request_rec *r, util_ldap_connecti const char ***retvals) { const char **vals = NULL; + int numvals = 0; int result = 0; LDAPMessage *res, *entry; char *dn; @@ -977,6 +978,7 @@ start_over: int i = 0; while (attrs[k++]); vals = apr_pcalloc(r->pool, sizeof(char *) * (k+1)); + numvals = k; while (attrs[i]) { char **values; int j = 0; @@ -1004,6 +1006,7 @@ start_over: the_search_node.bindpw = bindpw; the_search_node.lastbind = apr_time_now(); the_search_node.vals = vals; + the_search_node.numvals = numvals; /* Search again to make sure that another thread didn't ready insert this node into the cache before we got here. If it does exist then update the lastbind */ @@ -1046,6 +1049,7 @@ LDAP_DECLARE(int) util_ldap_cache_getuserdn(request_rec *r, util_ldap_connection const char ***retvals) { const char **vals = NULL; + int numvals = 0; int result = 0; LDAPMessage *res, *entry; char *dn; @@ -1160,6 +1164,7 @@ start_over: int i = 0; while (attrs[k++]); vals = apr_pcalloc(r->pool, sizeof(char *) * (k+1)); + numvals = k; while (attrs[i]) { char **values; int j = 0; @@ -1187,6 +1192,7 @@ start_over: the_search_node.bindpw = NULL; the_search_node.lastbind = apr_time_now(); the_search_node.vals = vals; + the_search_node.numvals = numvals; /* Search again to make sure that another thread didn't ready insert this node into the cache before we got here. If it does exist then update the lastbind */ diff --git a/modules/ldap/util_ldap_cache.c b/modules/ldap/util_ldap_cache.c index 97cb83d613..9adf20a4fa 100644 --- a/modules/ldap/util_ldap_cache.c +++ b/modules/ldap/util_ldap_cache.c @@ -159,18 +159,22 @@ void *util_ldap_search_node_copy(util_ald_cache_t *cache, void *c) /* copy vals */ if (node->vals) { - int k = 0; + int k = node->numvals; int i = 0; - while (node->vals[k++]); if (!(newnode->vals = util_ald_alloc(cache, sizeof(char *) * (k+1)))) { util_ldap_search_node_free(cache, newnode); return NULL; } - while (node->vals[i]) { - if (!(newnode->vals[i] = util_ald_strdup(cache, node->vals[i]))) { - util_ldap_search_node_free(cache, newnode); - return NULL; + newnode->numvals = node->numvals; + for (;k;k--) { + if (node->vals[i]) { + if (!(newnode->vals[i] = util_ald_strdup(cache, node->vals[i]))) { + util_ldap_search_node_free(cache, newnode); + return NULL; + } } + else + newnode->vals[i] = NULL; i++; } } @@ -200,9 +204,12 @@ void util_ldap_search_node_free(util_ald_cache_t *cache, void *n) { int i = 0; util_search_node_t *node = (util_search_node_t *)n; + int k = node->numvals; if (node->vals) { - while (node->vals[i]) { - util_ald_free(cache, node->vals[i++]); + for (;k;k--,i++) { + if (node->vals[i]) { + util_ald_free(cache, node->vals[i]); + } } util_ald_free(cache, node->vals); } diff --git a/modules/ldap/util_ldap_cache.h b/modules/ldap/util_ldap_cache.h index 478fbfc186..65580f574a 100644 --- a/modules/ldap/util_ldap_cache.h +++ b/modules/ldap/util_ldap_cache.h @@ -107,6 +107,7 @@ typedef struct util_search_node_t { NULL if the bind failed */ apr_time_t lastbind; /* Time of last successful bind */ const char **vals; /* Values of queried attributes */ + int numvals; /* Number of queried attributes */ } util_search_node_t; /*