提交 f9b32667 authored 作者: Anthony Minessale's avatar Anthony Minessale

endless recursion loop protection to go with new recursive variable expansion feature

上级 5f38a7f8
...@@ -593,8 +593,8 @@ SWITCH_DECLARE(void) switch_channel_event_set_extended_data(_In_ switch_channel_ ...@@ -593,8 +593,8 @@ SWITCH_DECLARE(void) switch_channel_event_set_extended_data(_In_ switch_channel_
\return the original string if no expansion takes place otherwise a new string that must be freed \return the original string if no expansion takes place otherwise a new string that must be freed
\note it's necessary to test if the return val is the same as the input and free the string if it is not. \note it's necessary to test if the return val is the same as the input and free the string if it is not.
*/ */
SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *channel, const char *in, switch_event_t *var_list, switch_event_t *api_list); SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *channel, const char *in, switch_event_t *var_list, switch_event_t *api_list, uint32_t recur);
#define switch_channel_expand_variables(_channel, _in) switch_channel_expand_variables_check(_channel, _in, NULL, NULL) #define switch_channel_expand_variables(_channel, _in) switch_channel_expand_variables_check(_channel, _in, NULL, NULL, 0)
SWITCH_DECLARE(char *) switch_channel_build_param_string(_In_ switch_channel_t *channel, _In_opt_ switch_caller_profile_t *caller_profile, SWITCH_DECLARE(char *) switch_channel_build_param_string(_In_ switch_channel_t *channel, _In_opt_ switch_caller_profile_t *caller_profile,
......
...@@ -330,8 +330,8 @@ SWITCH_DECLARE(switch_status_t) switch_event_add_body(switch_event_t *event, con ...@@ -330,8 +330,8 @@ SWITCH_DECLARE(switch_status_t) switch_event_add_body(switch_event_t *event, con
SWITCH_DECLARE(switch_status_t) switch_event_set_body(switch_event_t *event, const char *body); SWITCH_DECLARE(switch_status_t) switch_event_set_body(switch_event_t *event, const char *body);
SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, const char *in, switch_event_t *var_list, switch_event_t *api_list); SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, const char *in, switch_event_t *var_list, switch_event_t *api_list, uint32_t recur);
#define switch_event_expand_headers(_event, _in) switch_event_expand_headers_check(_event, _in, NULL, NULL) #define switch_event_expand_headers(_event, _in) switch_event_expand_headers_check(_event, _in, NULL, NULL, 0)
SWITCH_DECLARE(switch_status_t) switch_event_create_pres_in_detailed(_In_z_ char *file, _In_z_ char *func, _In_ int line, SWITCH_DECLARE(switch_status_t) switch_event_create_pres_in_detailed(_In_z_ char *file, _In_z_ char *func, _In_ int line,
_In_z_ const char *proto, _In_z_ const char *login, _In_z_ const char *proto, _In_z_ const char *login,
......
...@@ -3345,7 +3345,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_answer(switch_channel_t * ...@@ -3345,7 +3345,7 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_answer(switch_channel_t *
memset(c, 0, olen - cpos);\ memset(c, 0, olen - cpos);\
}} \ }} \
SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *channel, const char *in, switch_event_t *var_list, switch_event_t *api_list) SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *channel, const char *in, switch_event_t *var_list, switch_event_t *api_list, uint32_t recur)
{ {
char *p, *c = NULL; char *p, *c = NULL;
char *data, *indup, *endof_indup; char *data, *indup, *endof_indup;
...@@ -3354,6 +3354,10 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c ...@@ -3354,6 +3354,10 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c
char *func_val = NULL, *sb = NULL; char *func_val = NULL, *sb = NULL;
int nv = 0; int nv = 0;
if (recur > 100) {
return (char *) in;
}
if (zstr(in)) { if (zstr(in)) {
return (char *) in; return (char *) in;
} }
...@@ -3483,7 +3487,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c ...@@ -3483,7 +3487,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c
char *ptr; char *ptr;
int idx = -1; int idx = -1;
if ((expanded = switch_channel_expand_variables_check(channel, (char *) vname, var_list, api_list)) == vname) { if ((expanded = switch_channel_expand_variables_check(channel, (char *) vname, var_list, api_list, recur+1)) == vname) {
expanded = NULL; expanded = NULL;
} else { } else {
vname = expanded; vname = expanded;
...@@ -3508,7 +3512,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c ...@@ -3508,7 +3512,7 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c
sub_val = "INVALID"; sub_val = "INVALID";
} }
if ((expanded_sub_val = switch_channel_expand_variables(channel, sub_val)) == sub_val) { if ((expanded_sub_val = switch_channel_expand_variables_check(channel, sub_val, var_list, api_list, recur+1)) == sub_val) {
expanded_sub_val = NULL; expanded_sub_val = NULL;
} else { } else {
sub_val = expanded_sub_val; sub_val = expanded_sub_val;
...@@ -3547,13 +3551,13 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c ...@@ -3547,13 +3551,13 @@ SWITCH_DECLARE(char *) switch_channel_expand_variables_check(switch_channel_t *c
if (stream.data) { if (stream.data) {
char *expanded_vname = NULL; char *expanded_vname = NULL;
if ((expanded_vname = switch_channel_expand_variables_check(channel, (char *) vname, var_list, api_list)) == vname) { if ((expanded_vname = switch_channel_expand_variables_check(channel, (char *) vname, var_list, api_list, recur+1)) == vname) {
expanded_vname = NULL; expanded_vname = NULL;
} else { } else {
vname = expanded_vname; vname = expanded_vname;
} }
if ((expanded = switch_channel_expand_variables_check(channel, vval, var_list, api_list)) == vval) { if ((expanded = switch_channel_expand_variables_check(channel, vval, var_list, api_list, recur+1)) == vval) {
expanded = NULL; expanded = NULL;
} else { } else {
vval = expanded; vval = expanded;
......
...@@ -1992,7 +1992,7 @@ if ((dp = realloc(data, olen))) {\ ...@@ -1992,7 +1992,7 @@ if ((dp = realloc(data, olen))) {\
memset(c, 0, olen - cpos);\ memset(c, 0, olen - cpos);\
}} \ }} \
SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, const char *in, switch_event_t *var_list, switch_event_t *api_list) SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, const char *in, switch_event_t *var_list, switch_event_t *api_list, uint32_t recur)
{ {
char *p, *c = NULL; char *p, *c = NULL;
char *data, *indup, *endof_indup; char *data, *indup, *endof_indup;
...@@ -2003,6 +2003,10 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, ...@@ -2003,6 +2003,10 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event,
int nv = 0; int nv = 0;
char *gvar = NULL, *sb = NULL; char *gvar = NULL, *sb = NULL;
if (recur > 100) {
return (char *) in;
}
if (zstr(in)) { if (zstr(in)) {
return (char *) in; return (char *) in;
} }
...@@ -2132,7 +2136,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, ...@@ -2132,7 +2136,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event,
char *ptr; char *ptr;
int idx = -1; int idx = -1;
if ((expanded = switch_event_expand_headers_check(event, (char *) vname, var_list, api_list)) == vname) { if ((expanded = switch_event_expand_headers_check(event, (char *) vname, var_list, api_list, recur+1)) == vname) {
expanded = NULL; expanded = NULL;
} else { } else {
vname = expanded; vname = expanded;
...@@ -2162,7 +2166,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, ...@@ -2162,7 +2166,7 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event,
} }
if ((expanded_sub_val = switch_event_expand_headers(event, sub_val)) == sub_val) { if ((expanded_sub_val = switch_event_expand_headers_check(event, sub_val, var_list, api_list, recur+1)) == sub_val) {
expanded_sub_val = NULL; expanded_sub_val = NULL;
} else { } else {
sub_val = expanded_sub_val; sub_val = expanded_sub_val;
...@@ -2198,13 +2202,13 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event, ...@@ -2198,13 +2202,13 @@ SWITCH_DECLARE(char *) switch_event_expand_headers_check(switch_event_t *event,
if (stream.data) { if (stream.data) {
char *expanded_vname = NULL; char *expanded_vname = NULL;
if ((expanded_vname = switch_event_expand_headers_check(event, (char *) vname, var_list, api_list)) == vname) { if ((expanded_vname = switch_event_expand_headers_check(event, (char *) vname, var_list, api_list, recur+1)) == vname) {
expanded_vname = NULL; expanded_vname = NULL;
} else { } else {
vname = expanded_vname; vname = expanded_vname;
} }
if ((expanded = switch_event_expand_headers_check(event, vval, var_list, api_list)) == vval) { if ((expanded = switch_event_expand_headers_check(event, vval, var_list, api_list, recur+1)) == vval) {
expanded = NULL; expanded = NULL;
} else { } else {
vval = expanded; vval = expanded;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论