]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-5845 more leaks found by mikej
authorRaymond Chandler <intralanman@gmail.com>
Wed, 26 Mar 2014 02:44:16 +0000 (22:44 -0400)
committerRaymond Chandler <intralanman@gmail.com>
Wed, 26 Mar 2014 02:45:42 +0000 (22:45 -0400)
src/mod/applications/mod_lcr/mod_lcr.c

index 5b6a045465c278ec35cad980ba890ec6f7e526eb..8824b31639495cb2de5b625107a638e9acdf1fbb 100644 (file)
@@ -212,14 +212,18 @@ static const char *do_cid(switch_memory_pool_t *pool, const char *cid, const cha
                if (switch_string_var_check_const(src) || switch_string_has_escaped_data(src)) {
                        tmp_regex = switch_channel_expand_variables(channel, src);
                        src_regex = switch_core_strdup(pool, tmp_regex);
-                       switch_safe_free(tmp_regex);
+                       if ( tmp_regex != src ) {
+                               switch_safe_free(tmp_regex);
+                       }
                        src = src_regex;
                }
 
                if (switch_string_var_check_const(dst) || switch_string_has_escaped_data(dst)) {
                        tmp_regex = switch_channel_expand_variables(channel, dst);
                        dst_regex = switch_core_strdup(pool, tmp_regex);
-                       switch_safe_free(tmp_regex);
+                       if ( tmp_regex != dst ) {
+                               switch_safe_free(tmp_regex);
+                       }
                        dst = dst_regex;
                }
 
@@ -258,6 +262,7 @@ static char *get_bridge_data(switch_memory_pool_t *pool, char *dialed_number, ch
        char *header = NULL;
        char *user_rate = NULL;
        char *export_fields = NULL;
+       char *expanded = NULL;
 
        destination_number = switch_core_strdup(pool, dialed_number);
 
@@ -332,13 +337,25 @@ static char *get_bridge_data(switch_memory_pool_t *pool, char *dialed_number, ch
        }
 
        if (session && (switch_string_var_check_const(data) || switch_string_has_escaped_data(data))) {
-               data = switch_channel_expand_variables(switch_core_session_get_channel(session), data);
+               expanded = switch_channel_expand_variables(switch_core_session_get_channel(session), data);
+               if (expanded == data ) {
+                       expanded = NULL;
+               } else {
+                       data = switch_core_strdup( pool, expanded );
+               }
        }
 
        if (session && (switch_string_var_check_const(data) || switch_string_has_escaped_data(data))) {
-               data = switch_channel_expand_variables(switch_core_session_get_channel(session), data);
+               expanded = switch_channel_expand_variables(switch_core_session_get_channel(session), data);
+               if (expanded == data ) {
+                       expanded = NULL;
+               } else {
+                       data = switch_core_strdup( pool, expanded );
+               }
        }
 
+       switch_safe_free(expanded);
+
        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Returning Dialstring %s\n", data);
 
        return data;
@@ -549,13 +566,13 @@ static char *expand_digits(switch_memory_pool_t *pool, char *digits, switch_bool
 /* format the custom sql */
 static char *format_custom_sql(const char *custom_sql, callback_t *cb_struct, const char *digits)
 {
-       char * newSQL = NULL;
+       char *replace = NULL;
        switch_channel_t *channel;
 
        /* first replace %s with digits to maintain backward compat */
        if (cb_struct->profile->custom_sql_has_percent == SWITCH_TRUE) {
-               newSQL = switch_string_replace(custom_sql, "%q", digits);
-               custom_sql = newSQL;
+               replace = switch_string_replace(custom_sql, "%q", digits);
+               custom_sql = replace;
        }
 
        /* expand the vars */
@@ -563,21 +580,22 @@ static char *format_custom_sql(const char *custom_sql, callback_t *cb_struct, co
                if (cb_struct->session) {
                        channel = switch_core_session_get_channel(cb_struct->session);
                        switch_assert(channel);
-                       newSQL = switch_channel_expand_variables(channel, newSQL ? newSQL : custom_sql);
-                       custom_sql = newSQL;
+                       custom_sql = switch_channel_expand_variables(channel, custom_sql);
+                       if ( custom_sql != replace ) {
+                               switch_safe_free(replace);
+                       }
                } else if (cb_struct->event) {
                        /* use event system to expand vars */
-                       newSQL = switch_event_expand_headers(cb_struct->event, newSQL ? newSQL : custom_sql);
-                       custom_sql = newSQL;
+                       custom_sql = switch_event_expand_headers(cb_struct->event, custom_sql);
+                       if ( custom_sql != replace ) {
+                               switch_safe_free(replace);
+                       }
                } else {
                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(cb_struct->session), SWITCH_LOG_CRIT,
                                                                "mod_lcr called without a valid session while using a custom_sql that has channel variables.\n");
                }
        }
 
-       if (newSQL == NULL) {
-               switch_safe_free(newSQL);
-       }
        return (char *) custom_sql;
 }