|
|
|
@ -4249,7 +4249,6 @@ int ast_thread_inhibit_escalations(void)
|
|
|
|
|
|
|
|
|
|
thread_inhibit_escalations = ast_threadstorage_get(
|
|
|
|
|
&thread_inhibit_escalations_tl, sizeof(*thread_inhibit_escalations));
|
|
|
|
|
|
|
|
|
|
if (thread_inhibit_escalations == NULL) {
|
|
|
|
|
ast_log(LOG_ERROR, "Error inhibiting privilege escalations for current thread\n");
|
|
|
|
|
return -1;
|
|
|
|
@ -4259,6 +4258,23 @@ int ast_thread_inhibit_escalations(void)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ast_thread_inhibit_escalations_swap(int inhibit)
|
|
|
|
|
{
|
|
|
|
|
int *thread_inhibit_escalations;
|
|
|
|
|
int orig;
|
|
|
|
|
|
|
|
|
|
thread_inhibit_escalations = ast_threadstorage_get(
|
|
|
|
|
&thread_inhibit_escalations_tl, sizeof(*thread_inhibit_escalations));
|
|
|
|
|
if (thread_inhibit_escalations == NULL) {
|
|
|
|
|
ast_log(LOG_ERROR, "Error swapping privilege escalations inhibit for current thread\n");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
orig = *thread_inhibit_escalations;
|
|
|
|
|
*thread_inhibit_escalations = !!inhibit;
|
|
|
|
|
return orig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief Indicates whether the current thread inhibits the execution of
|
|
|
|
|
* dangerous functions.
|
|
|
|
@ -4272,7 +4288,6 @@ static int thread_inhibits_escalations(void)
|
|
|
|
|
|
|
|
|
|
thread_inhibit_escalations = ast_threadstorage_get(
|
|
|
|
|
&thread_inhibit_escalations_tl, sizeof(*thread_inhibit_escalations));
|
|
|
|
|
|
|
|
|
|
if (thread_inhibit_escalations == NULL) {
|
|
|
|
|
ast_log(LOG_ERROR, "Error checking thread's ability to run dangerous functions\n");
|
|
|
|
|
/* On error, assume that we are inhibiting */
|
|
|
|
@ -10248,13 +10263,25 @@ static int ast_add_extension2_lockopt(struct ast_context *con,
|
|
|
|
|
|
|
|
|
|
/* If we are adding a hint evalulate in variables and global variables */
|
|
|
|
|
if (priority == PRIORITY_HINT && strstr(application, "${") && extension[0] != '_') {
|
|
|
|
|
int inhibited;
|
|
|
|
|
struct ast_channel *c = ast_dummy_channel_alloc();
|
|
|
|
|
|
|
|
|
|
if (c) {
|
|
|
|
|
ast_channel_exten_set(c, extension);
|
|
|
|
|
ast_channel_context_set(c, con->name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* We can allow dangerous functions when adding a hint since
|
|
|
|
|
* altering dialplan is itself a privileged activity. Otherwise,
|
|
|
|
|
* we could never execute dangerous functions.
|
|
|
|
|
*/
|
|
|
|
|
inhibited = ast_thread_inhibit_escalations_swap(0);
|
|
|
|
|
pbx_substitute_variables_helper(c, application, expand_buf, sizeof(expand_buf));
|
|
|
|
|
if (0 < inhibited) {
|
|
|
|
|
ast_thread_inhibit_escalations();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
application = expand_buf;
|
|
|
|
|
if (c) {
|
|
|
|
|
ast_channel_unref(c);
|
|
|
|
|