Skip to content

Commit

Permalink
Fix infinite loop releasing the same memory in ldap_loadentry().
Browse files Browse the repository at this point in the history
* Fixed memory leak of vars in ldap_loadentry().

* Fixed potential NULL ptr dereference of vars in ldap_loadentry().


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@332615 65c4cc65-6c06-0410-ace0-fbb531ad65f3
  • Loading branch information
rmudgett9125 committed Aug 19, 2011
1 parent d2af16a commit 0f92716
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions res/res_config_ldap.c
Expand Up @@ -609,17 +609,17 @@ static struct ast_variable *ldap_loadentry(struct ldap_table_config *table_confi
/* Chopping \a vars down to one variable */
if (vars != NULL) {
struct ast_variable **p = vars;
p++;
var = *p;
while (var) {
ast_variables_destroy(var);
p++;

/* Only take the first one. */
var = *vars;

/* Destroy the rest. */
while (*++p) {
ast_variables_destroy(*p);
}
vars = ast_realloc(vars, sizeof(struct ast_variable *));
ast_free(vars);
}

var = *vars;

return var;
}
}
Expand Down Expand Up @@ -864,6 +864,11 @@ static struct ast_variable **realtime_ldap_base_ap(unsigned int *entries_count_p
ast_variables_destroy(base_var);
base_var = next;
} else {
/*!
* \todo XXX The interactions with base_var and append_var may
* cause a memory leak of base_var nodes. Also the append_var
* list and base_var list may get cross linked.
*/
if (append_var) {
base_var->next = append_var;
} else {
Expand Down Expand Up @@ -926,6 +931,8 @@ static struct ast_variable *realtime_ldap(const char *basedn,
if (vars) {
struct ast_variable *last_var = NULL;
struct ast_variable **p = vars;

/* Chain the vars array of lists into one list to return. */
while (*p) {
if (last_var) {
while (last_var->next) {
Expand Down

0 comments on commit 0f92716

Please sign in to comment.