]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add reload, fix leak in failure cases (MDXMLINT-27)
authorMichael Jerris <mike@jerris.com>
Tue, 8 Jul 2008 04:07:53 +0000 (04:07 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 8 Jul 2008 04:07:53 +0000 (04:07 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8918 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/xml_int/mod_xml_curl/mod_xml_curl.c

index b023b84f2d8c962b02aa8942c3702c726c281804..e918fa79afb1e6f6448a56af8d2ffe4b50c0b642 100644 (file)
@@ -44,7 +44,6 @@ struct xml_binding {
        int disable100continue;
        uint32_t ignore_cacert_check;
        switch_hash_t *vars_map;
-       switch_memory_pool_t *vars_map_pool;
 };
 
 static int keep_files_around = 0;
@@ -56,6 +55,17 @@ struct config_data {
        int fd;
 };
 
+typedef struct hash_node {
+    switch_hash_t* hash;
+    struct hash_node* next;
+} hash_node_t;
+
+static struct {
+    switch_memory_pool_t* pool;
+    hash_node_t* hash_root;
+    hash_node_t* hash_tail;
+} globals;
+
 #define XML_CURL_SYNTAX "[debug_on|debug_off]"
 SWITCH_STANDARD_API(xml_curl_function)
 {
@@ -212,7 +222,6 @@ static switch_status_t do_config(void)
        int x = 0;
        int need_vars_map = 0;
        switch_hash_t *vars_map = NULL;
-       switch_memory_pool_t *vars_map_pool = NULL;
 
        if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
@@ -231,6 +240,9 @@ static switch_status_t do_config(void)
                char *bind_mask = NULL;
                int disable100continue = 0;
                uint32_t ignore_cacert_check = 0;
+               hash_node_t* hash_node;
+               need_vars_map = 0;
+               vars_map = NULL;
 
                for (param = switch_xml_child(binding_tag, "param"); param; param = param->next) {
                        char *var = (char *) switch_xml_attr_soft(param, "name");
@@ -248,15 +260,8 @@ static switch_status_t do_config(void)
                                ignore_cacert_check = 1;
                        } else if (!strcasecmp(var, "enable-post-var")) {
                                if (!vars_map && need_vars_map == 0) {
-                                       if (switch_core_new_memory_pool(&vars_map_pool) != SWITCH_STATUS_SUCCESS) {
-                                               need_vars_map = -1;
-                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cant create memory pool!\n");
-                                               continue;
-                                       }
-
-                                       if (switch_core_hash_init(&vars_map, vars_map_pool) != SWITCH_STATUS_SUCCESS) {
+                                       if (switch_core_hash_init(&vars_map, globals.pool) != SWITCH_STATUS_SUCCESS) {
                                                need_vars_map = -1;
-                                               switch_core_destroy_memory_pool(&vars_map_pool);
                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cant init params hash!\n");
                                                continue;
                                        }
@@ -267,16 +272,19 @@ static switch_status_t do_config(void)
                                        if (switch_core_hash_insert(vars_map, val, ENABLE_PARAM_VALUE) != SWITCH_STATUS_SUCCESS) {
                                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cant add %s to params hash!\n", val);
                                        }
-
                        }
                }
 
                if (!url) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Binding has no url!\n");
+                       if (vars_map)
+                           switch_core_hash_destroy(&vars_map);
                        continue;
                }
 
                if (!(binding = malloc(sizeof(*binding)))) {
+                       if (vars_map)
+                           switch_core_hash_destroy(&vars_map);
                        goto done;
                }
                memset(binding, 0, sizeof(*binding));
@@ -295,7 +303,23 @@ static switch_status_t do_config(void)
                binding->ignore_cacert_check = ignore_cacert_check;
 
                binding->vars_map = vars_map;
-               binding->vars_map_pool = vars_map_pool;
+               
+               if(vars_map) {
+                   switch_zmalloc(hash_node,sizeof(hash_node_t));
+                   hash_node->hash = vars_map;
+                   hash_node->next = NULL;
+                   
+                   if(!globals.hash_root) {
+                       globals.hash_root = hash_node;
+                       globals.hash_tail = globals.hash_root;
+                   }
+                   
+                   else {
+                       globals.hash_tail->next = hash_node;
+                       globals.hash_tail = globals.hash_tail->next;
+                   }
+                       
+               }
 
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Binding [%s] XML Fetch Function [%s] [%s]\n",
                                                  switch_strlen_zero(bname) ? "N/A" : bname, binding->url, binding->bindings ? binding->bindings : "all");
@@ -321,6 +345,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_curl_load)
        switch_console_set_complete("add xml_curl debug_on");
        switch_console_set_complete("add xml_curl debug_off");
 
+       memset(&globals,0,sizeof(globals));
+       globals.pool = pool;
+       globals.hash_root = NULL;
+       globals.hash_tail = NULL;
 
        if (do_config() == SWITCH_STATUS_SUCCESS) {
                curl_global_init(CURL_GLOBAL_ALL);
@@ -334,6 +362,16 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_curl_load)
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_curl_shutdown)
 {
+       hash_node_t* ptr = NULL;
+
+       while(globals.hash_root) {
+           ptr = globals.hash_root;
+           switch_core_hash_destroy(&ptr->hash);
+           globals.hash_root = ptr->next;
+           switch_safe_free(ptr);
+       }
+       
+       switch_xml_unbind_search_function_ptr(xml_url_fetch);
        curl_global_cleanup();
        return SWITCH_STATUS_SUCCESS;
 }