mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-15 21:22:57 +00:00
FS-10867: [freeswitch-core] Prevent stack smash when queing multiple sound files without event-lock #resolve
This commit is contained in:
parent
1a2d406e86
commit
291da11322
@ -1117,6 +1117,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_get_app_flags(const char *ap
|
|||||||
*/
|
*/
|
||||||
#define switch_core_session_execute_application(_a, _b, _c) switch_core_session_execute_application_get_flags(_a, _b, _c, NULL)
|
#define switch_core_session_execute_application(_a, _b, _c) switch_core_session_execute_application_get_flags(_a, _b, _c, NULL)
|
||||||
|
|
||||||
|
SWITCH_DECLARE(uint32_t) switch_core_session_stack_count(switch_core_session_t *session, int x);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Run a dialplan and execute an extension
|
\brief Run a dialplan and execute an extension
|
||||||
\param session the current session
|
\param session the current session
|
||||||
|
@ -2895,6 +2895,14 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_exec(switch_core_session_t *
|
|||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(uint32_t) switch_core_session_stack_count(switch_core_session_t *session, int x)
|
||||||
|
{
|
||||||
|
if (x > 0) session->stack_count++;
|
||||||
|
else if (x < 0) session->stack_count--;
|
||||||
|
|
||||||
|
return session->stack_count;
|
||||||
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_exten(switch_core_session_t *session, const char *exten, const char *dialplan,
|
SWITCH_DECLARE(switch_status_t) switch_core_session_execute_exten(switch_core_session_t *session, const char *exten, const char *dialplan,
|
||||||
const char *context)
|
const char *context)
|
||||||
{
|
{
|
||||||
|
@ -898,6 +898,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_
|
|||||||
int x = 0;
|
int x = 0;
|
||||||
switch_channel_t *channel;
|
switch_channel_t *channel;
|
||||||
|
|
||||||
|
if (switch_core_session_stack_count(session, 0) > SWITCH_MAX_STACKS) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error %s too many stacked extensions\n",
|
||||||
|
switch_core_session_get_name(session));
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_core_session_stack_count(session, 1);
|
||||||
|
|
||||||
switch_ivr_parse_all_messages(session);
|
switch_ivr_parse_all_messages(session);
|
||||||
|
|
||||||
channel = switch_core_session_get_channel(session);
|
channel = switch_core_session_get_channel(session);
|
||||||
@ -914,6 +922,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_parse_all_events(switch_core_session_
|
|||||||
x++;
|
x++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_core_session_stack_count(session, -1);
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user