aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xSECURITY6
-rwxr-xr-xchannels/chan_sip.c39
-rwxr-xr-xpbx.c5
3 files changed, 32 insertions, 18 deletions
diff --git a/SECURITY b/SECURITY
index 604b2fb1d..b31fb17ab 100755
--- a/SECURITY
+++ b/SECURITY
@@ -25,15 +25,15 @@ the "default" context within other private contexts by using:
in the appropriate section. A well designed PBX might look like this:
[longdistance]
-exten => _91NXXNXXXXXX,1,Dial,Tor/g2/BYEXTENSION
+exten => _91NXXNXXXXXX,1,Dial(Zap/g2/${EXTEN:1})
include => local
[local]
-exten => _9NXXNXXX,1,Dial,Tor/g2/BYEXTENSION
+exten => _9NXXNXXX,1,Dial(Zap/g2/${EXTEN:1})
include => default
[default]
-exten => 6123,Dial,Tor/1
+exten => 6123,Dial(Zap/1)
DON'T FORGET TO TAKE THE DEMO CONTEXT OUT OF YOUR DEFAULT CONTEXT. There
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a3f6e0ec6..93dd67fee 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -5885,6 +5885,7 @@ restartsearch:
static int restart_monitor(void)
{
+ pthread_attr_t attr;
/* If we're supposed to be stopped -- stay stopped */
if (monitor_thread == AST_PTHREADT_STOP)
return 0;
@@ -5901,8 +5902,10 @@ static int restart_monitor(void)
/* Wake up the thread */
pthread_kill(monitor_thread, SIGURG);
} else {
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* Start a new monitor */
- if (pthread_create(&monitor_thread, NULL, do_monitor, NULL) < 0) {
+ if (pthread_create(&monitor_thread, &attr, do_monitor, NULL) < 0) {
ast_mutex_unlock(&monlock);
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
return -1;
@@ -6701,26 +6704,34 @@ static char *descrip_dtmfmode = "SIPDtmfMode(inband|info|rfc2833): Changes the d
static char *app_dtmfmode = "SIPDtmfMode";
static int sip_dtmfmode(struct ast_channel *chan, void *data)
{
- struct sip_pvt *p = chan->pvt->pvt;
+ struct sip_pvt *p;
char *mode;
- if (chan->type != type) {
- ast_log(LOG_WARNING, "Call this application only on SIP incoming calls\n");
- return 0;
- }
if (data)
mode = (char *)data;
else {
ast_log(LOG_WARNING, "This application requires the argument: info, inband, rfc2833\n");
return 0;
}
- if (!strcasecmp(mode,"info"))
- p->dtmfmode = SIP_DTMF_INFO;
- else if (!strcasecmp(mode,"rfc2833"))
- p->dtmfmode = SIP_DTMF_RFC2833;
- else if (!strcasecmp(mode,"inband"))
- p->dtmfmode = SIP_DTMF_INBAND;
- else
- ast_log(LOG_WARNING, "I don't know about this dtmf mode: %s\n",mode);
+ ast_mutex_lock(&chan->lock);
+ if (chan->type != type) {
+ ast_log(LOG_WARNING, "Call this application only on SIP incoming calls\n");
+ ast_mutex_unlock(&chan->lock);
+ return 0;
+ }
+ p = chan->pvt->pvt;
+ if (p) {
+ ast_mutex_lock(&p->lock);
+ if (!strcasecmp(mode,"info"))
+ p->dtmfmode = SIP_DTMF_INFO;
+ else if (!strcasecmp(mode,"rfc2833"))
+ p->dtmfmode = SIP_DTMF_RFC2833;
+ else if (!strcasecmp(mode,"inband"))
+ p->dtmfmode = SIP_DTMF_INBAND;
+ else
+ ast_log(LOG_WARNING, "I don't know about this dtmf mode: %s\n",mode);
+ ast_mutex_unlock(&p->lock);
+ }
+ ast_mutex_unlock(&chan->lock);
return 0;
}
diff --git a/pbx.c b/pbx.c
index b837af4f0..12adae667 100755
--- a/pbx.c
+++ b/pbx.c
@@ -4044,7 +4044,10 @@ int ast_pbx_outgoing_app(char *type, int format, void *data, int timeout, char *
if (appdata)
strncpy(as->appdata, appdata, sizeof(as->appdata) - 1);
as->timeout = timeout;
- if (pthread_create(&as->p, NULL, async_wait, as)) {
+ /* Start a new thread, and get something handling this channel. */
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (pthread_create(&as->p, &attr, async_wait, as)) {
ast_log(LOG_WARNING, "Failed to start async wait\n");
free(as);
ast_hangup(chan);