[asterisk-commits] mjordan: tag 1.8.9.2 r354641 - in /tags/1.8.9.2: ./ apps/ channels/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Feb 9 13:12:58 CST 2012
Author: mjordan
Date: Thu Feb 9 13:12:53 2012
New Revision: 354641
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=354641
Log:
Committing r354495, 354542, 354547 for 1.8.9.2
Removed:
tags/1.8.9.2/asterisk-1.8.9.1-summary.html
tags/1.8.9.2/asterisk-1.8.9.1-summary.txt
Modified:
tags/1.8.9.2/ (props changed)
tags/1.8.9.2/.version
tags/1.8.9.2/ChangeLog
tags/1.8.9.2/apps/app_parkandannounce.c
tags/1.8.9.2/channels/chan_sip.c
Propchange: tags/1.8.9.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Feb 9 13:12:53 2012
@@ -1,1 +1,1 @@
-/branches/1.8:349731,350552,351504,352014,352199
+/branches/1.8:349731,350552,351504,352014,352199,354495,354542,354547
Modified: tags/1.8.9.2/.version
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.9.2/.version?view=diff&rev=354641&r1=354640&r2=354641
==============================================================================
--- tags/1.8.9.2/.version (original)
+++ tags/1.8.9.2/.version Thu Feb 9 13:12:53 2012
@@ -1,1 +1,1 @@
-1.8.9.1
+1.8.9.2
Modified: tags/1.8.9.2/ChangeLog
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.9.2/ChangeLog?view=diff&rev=354641&r1=354640&r2=354641
==============================================================================
--- tags/1.8.9.2/ChangeLog (original)
+++ tags/1.8.9.2/ChangeLog Thu Feb 9 13:12:53 2012
@@ -1,3 +1,27 @@
+2012-02-09 Asterisk Development Team <asteriskteam at digium.com>
+
+ * Asterisk 1.8.9.2 Released.
+
+ * channels/chan_sip.c: Fix SIP INFO DTMF handling for non-numeric
+ codes. In ASTERISK-18924, SIP INFO DTMF handling was changed to
+ account for both lowercase alphatbetic DTMF events, as well as
+ uppercase alphabetic DTMF events. When this occurred, the comparison
+ of the character buffer containing the event code was changed such
+ that the buffer was first compared against '0' and '9' to determine if
+ it was numeric. Unfortunately, since the first character in the
+ buffer will typically be '1' in the case of non-numeric event codes
+ (10-16), this caused those codes to be converted to a DTMF event of
+ '1'. This patch fixes that, and cleans up handling of both
+ application/dtmf-relay and application/dtmf content types.
+ Review: https://reviewboard.asterisk.org/r/1722/
+ (closes issue ASTERISK-19290) Reported by: Ira Emus
+ Tested by: mjordan
+
+ * apps/app_parkandannounce.c: Fix crash in ParkAndAnnounce from
+ uninitialized caller_id storage (closes issue ASTERISK-19311)
+ Reported by: tootai
+ Tested by: rmudgett
+
2012-02-06 Asterisk Development Team <asteriskteam at digium.com>
* Asterisk 1.8.9.1 Released.
Modified: tags/1.8.9.2/apps/app_parkandannounce.c
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.9.2/apps/app_parkandannounce.c?view=diff&rev=354641&r1=354640&r2=354641
==============================================================================
--- tags/1.8.9.2/apps/app_parkandannounce.c (original)
+++ tags/1.8.9.2/apps/app_parkandannounce.c Thu Feb 9 13:12:53 2012
@@ -140,6 +140,7 @@
}
/* Save the CallerID because the masquerade turns chan into a ZOMBIE. */
+ ast_party_id_init(&caller_id);
ast_channel_lock(chan);
ast_party_id_copy(&caller_id, &chan->caller.id);
ast_channel_unlock(chan);
Modified: tags/1.8.9.2/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/tags/1.8.9.2/channels/chan_sip.c?view=diff&rev=354641&r1=354640&r2=354641
==============================================================================
--- tags/1.8.9.2/channels/chan_sip.c (original)
+++ tags/1.8.9.2/channels/chan_sip.c Thu Feb 9 13:12:53 2012
@@ -18528,7 +18528,8 @@
/* Need to check the media/type */
if (!strcasecmp(c, "application/dtmf-relay") ||
- !strcasecmp(c, "application/vnd.nortelnetworks.digits")) {
+ !strcasecmp(c, "application/vnd.nortelnetworks.digits") ||
+ !strcasecmp(c, "application/dtmf")) {
unsigned int duration = 0;
if (!p->owner) { /* not a PBX call */
@@ -18537,48 +18538,62 @@
return;
}
- /* Try getting the "signal=" part */
- if (ast_strlen_zero(c = get_body(req, "Signal", '=')) && ast_strlen_zero(c = get_body(req, "d", '='))) {
- ast_log(LOG_WARNING, "Unable to retrieve DTMF signal from INFO message from %s\n", p->callid);
- transmit_response(p, "200 OK", req); /* Should return error */
- return;
+ /* If dtmf-relay or vnd.nortelnetworks.digits, parse the signal and duration;
+ * otherwise use the body as the signal */
+ if (strcasecmp(c, "application/dtmf")) {
+ const char *msg_body;
+
+ if ( ast_strlen_zero(msg_body = get_body(req, "Signal", '='))
+ && ast_strlen_zero(msg_body = get_body(req, "d", '='))) {
+ ast_log(LOG_WARNING, "Unable to retrieve DTMF signal for INFO message on "
+ "call %s\n", p->callid);
+ transmit_response(p, "200 OK", req);
+ return;
+ }
+ ast_copy_string(buf, msg_body, sizeof(buf));
+
+ if (!ast_strlen_zero((msg_body = get_body(req, "Duration", '=')))) {
+ sscanf(msg_body, "%30u", &duration);
+ }
} else {
- ast_copy_string(buf, c, sizeof(buf));
- }
-
- if (!ast_strlen_zero((c = get_body(req, "Duration", '='))))
- duration = atoi(c);
- if (!duration)
- duration = 100; /* 100 ms */
-
-
+ /* Type is application/dtmf, simply use what's in the message body */
+ get_msg_text(buf, sizeof(buf), req);
+ }
+
+ /* An empty message body requires us to send a 200 OK */
if (ast_strlen_zero(buf)) {
transmit_response(p, "200 OK", req);
return;
}
- if ('0' <= buf[0] && buf[0] <= '9') {
- event = buf[0] - '0';
- } else if (buf[0] == '*') {
+ if (!duration) {
+ duration = 100; /* 100 ms */
+ }
+
+ if (buf[0] == '*') {
event = 10;
} else if (buf[0] == '#') {
event = 11;
+ } else if (buf[0] == '!') {
+ event = 16;
} else if ('A' <= buf[0] && buf[0] <= 'D') {
event = 12 + buf[0] - 'A';
} else if ('a' <= buf[0] && buf[0] <= 'd') {
event = 12 + buf[0] - 'a';
- } else if (buf[0] == '!') {
- event = 16;
- } else {
- /* Unknown digit */
- event = 0;
- }
+ } else if ((sscanf(buf, "%30u", &event) != 1) || event > 16) {
+ ast_log(AST_LOG_WARNING, "Unable to convert DTMF event signal code to a valid "
+ "value for INFO message on call %s\n", p->callid);
+ transmit_response(p, "200 OK", req);
+ return;
+ }
+
if (event == 16) {
/* send a FLASH event */
struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_FLASH, } };
ast_queue_frame(p->owner, &f);
- if (sipdebug)
+ if (sipdebug) {
ast_verbose("* DTMF-relay event received: FLASH\n");
+ }
} else {
/* send a DTMF event */
struct ast_frame f = { AST_FRAME_DTMF, };
@@ -18588,63 +18603,17 @@
f.subclass.integer = '*';
} else if (event == 11) {
f.subclass.integer = '#';
- } else if (event < 16) {
+ } else {
f.subclass.integer = 'A' + (event - 12);
}
f.len = duration;
ast_queue_frame(p->owner, &f);
- if (sipdebug)
+ if (sipdebug) {
ast_verbose("* DTMF-relay event received: %c\n", (int) f.subclass.integer);
+ }
}
transmit_response(p, "200 OK", req);
return;
- } else if (!strcasecmp(c, "application/dtmf")) {
- /*! \todo Note: Doesn't read the duration of the DTMF. Should be fixed. */
- unsigned int duration = 0;
-
- if (!p->owner) { /* not a PBX call */
- transmit_response(p, "481 Call leg/transaction does not exist", req);
- sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
- return;
- }
-
- get_msg_text(buf, sizeof(buf), req);
- duration = 100; /* 100 ms */
-
- if (ast_strlen_zero(buf)) {
- transmit_response(p, "200 OK", req);
- return;
- }
- event = atoi(buf);
- if (event == 16) {
- /* send a FLASH event */
- struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_FLASH }, };
- ast_queue_frame(p->owner, &f);
- if (sipdebug)
- ast_verbose("* DTMF-relay event received: FLASH\n");
- } else {
- /* send a DTMF event */
- struct ast_frame f = { AST_FRAME_DTMF, };
- if (event < 10) {
- f.subclass.integer = '0' + event;
- } else if (event == 10) {
- f.subclass.integer = '*';
- } else if (event == 11) {
- f.subclass.integer = '#';
- } else if (event < 16) {
- f.subclass.integer = 'A' + (event - 12);
- } else {
- /* Unknown digit. */
- f.subclass.integer = '0';
- }
- f.len = duration;
- ast_queue_frame(p->owner, &f);
- if (sipdebug)
- ast_verbose("* DTMF-relay event received: %c\n", (int) f.subclass.integer);
- }
- transmit_response(p, "200 OK", req);
- return;
-
} else if (!strcasecmp(c, "application/media_control+xml")) {
/* Eh, we'll just assume it's a fast picture update for now */
if (p->owner)
More information about the asterisk-commits
mailing list