pjsip_cli: Fix memory leak in ast_sip_cli_print_sorcery_objectset.
authorGeorge Joseph <george.joseph@fairview5.com>
Thu, 20 Feb 2014 21:04:28 +0000 (21:04 +0000)
committerGeorge Joseph <george.joseph@fairview5.com>
Thu, 20 Feb 2014 21:04:28 +0000 (21:04 +0000)
Fixed memory leaks in ast_sip_cli_print_sorcery_objectset and
ast_variable_list_sort.

(closes issue ASTERISK-23266)
Review: http://reviewboard.asterisk.org/r/3200/
........

Merged revisions 408520 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@408521 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/config.c
res/res_pjsip/pjsip_cli.c

index a45f573..8961fa9 100644 (file)
@@ -596,19 +596,19 @@ inline struct ast_variable *variable_list_switch(struct ast_variable *l1, struct
 
 struct ast_variable *ast_variable_list_sort(struct ast_variable *start)
 {
-       struct ast_variable *p, *q, *top;
+       struct ast_variable *p, *q;
+       struct ast_variable top;
        int changed = 1;
-       top = ast_calloc(1, sizeof(struct ast_variable));
-       top->next = start;
+       memset(&top, 0, sizeof(top));
+       top.next = start;
        if (start != NULL && start->next != NULL) {
                while (changed) {
                        changed = 0;
-                       q = top;
-                       p = top->next;
+                       q = &top;
+                       p = top.next;
                        while (p->next != NULL) {
                                if (p->next != NULL && strcmp(p->name, p->next->name) > 0) {
                                        q->next = variable_list_switch(p, p->next);
-
                                        changed = 1;
                                }
                                q = p;
@@ -617,7 +617,7 @@ struct ast_variable *ast_variable_list_sort(struct ast_variable *start)
                        }
                }
        }
-       return top->next;
+       return top.next;
 }
 
 const char *ast_config_option(struct ast_config *cfg, const char *cat, const char *var)
index 6abd629..6ad820a 100644 (file)
@@ -71,9 +71,8 @@ int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags)
                }
        }
 
-       if (!(separator = alloca(max_name_width + max_value_width + 8))) {
-               return -1;
-       }
+       separator = ast_alloca(max_name_width + max_value_width + 8);
+
        memset(separator, '=', max_name_width + max_value_width + 3);
        separator[max_name_width + max_value_width + 3] = 0;
 
@@ -86,6 +85,8 @@ int ast_sip_cli_print_sorcery_objectset(void *obj, void *arg, int flags)
                ast_str_append(&context->output_buffer, 0, " %-*s : %s\n", max_name_width, i->name, i->value);
        }
 
+       ast_variables_destroy(objset);
+
        return 0;
 }