mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Fix infinite loop releasing the same memory in ldap_loadentry().
* 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
This commit is contained in:
@@ -609,16 +609,16 @@ static struct ast_variable *ldap_loadentry(struct ldap_table_config *table_confi
|
|||||||
/* Chopping \a vars down to one variable */
|
/* Chopping \a vars down to one variable */
|
||||||
if (vars != NULL) {
|
if (vars != NULL) {
|
||||||
struct ast_variable **p = vars;
|
struct ast_variable **p = vars;
|
||||||
p++;
|
|
||||||
var = *p;
|
|
||||||
while (var) {
|
|
||||||
ast_variables_destroy(var);
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
vars = ast_realloc(vars, sizeof(struct ast_variable *));
|
|
||||||
}
|
|
||||||
|
|
||||||
var = *vars;
|
/* Only take the first one. */
|
||||||
|
var = *vars;
|
||||||
|
|
||||||
|
/* Destroy the rest. */
|
||||||
|
while (*++p) {
|
||||||
|
ast_variables_destroy(*p);
|
||||||
|
}
|
||||||
|
ast_free(vars);
|
||||||
|
}
|
||||||
|
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
@@ -864,6 +864,11 @@ static struct ast_variable **realtime_ldap_base_ap(unsigned int *entries_count_p
|
|||||||
ast_variables_destroy(base_var);
|
ast_variables_destroy(base_var);
|
||||||
base_var = next;
|
base_var = next;
|
||||||
} else {
|
} 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) {
|
if (append_var) {
|
||||||
base_var->next = append_var;
|
base_var->next = append_var;
|
||||||
} else {
|
} else {
|
||||||
@@ -926,6 +931,8 @@ static struct ast_variable *realtime_ldap(const char *basedn,
|
|||||||
if (vars) {
|
if (vars) {
|
||||||
struct ast_variable *last_var = NULL;
|
struct ast_variable *last_var = NULL;
|
||||||
struct ast_variable **p = vars;
|
struct ast_variable **p = vars;
|
||||||
|
|
||||||
|
/* Chain the vars array of lists into one list to return. */
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (last_var) {
|
if (last_var) {
|
||||||
while (last_var->next) {
|
while (last_var->next) {
|
||||||
|
Reference in New Issue
Block a user