summaryrefslogtreecommitdiff
path: root/apps/app_sms.c
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-04-19 01:31:27 +0000
committerMatthew Jordan <mjordan@digium.com>2014-04-19 01:31:27 +0000
commit21759b02ede44a565d87dc302733cbfa6fb56b08 (patch)
tree60a4d53c5752339ec35b433745b78cf6f9fe7431 /apps/app_sms.c
parentb9d7dfcc62c80d2b2827dd7b70701dfb21512c13 (diff)
app_sms: Fix uninitialized values; hangup channel when REL is sent successfully
This patch fixes two issues in app_sms: (1) Firstly, the 'flags' field on the stack in sms_exec() is uninitialised, causing it to use the wrong protocol in some cases. This patch correctly initializes the flags fields. (2) Secondly, when disconnect supervision is not working or inbanddisconnect=yes is set in chan_dahdi.conf, app_sms was failing to terminate the call after it sent the REL(ease) message and the peer stopped talking to it. This patch fixes the code to handle the 'bad stop bit' message more gracefully in that case, and hang up the call. Review: https://reviewboard.asterisk.org/r/1392/ ASTERISK-18331 #close Reported by: David Woodhouse patches: asterisk-fix-sms.patch uploaded by David Woodhouse (License 5754) ........ Merged revisions 412655 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 412656 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 412657 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@412697 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_sms.c')
-rw-r--r--apps/app_sms.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/apps/app_sms.c b/apps/app_sms.c
index f693a209e..12fede073 100644
--- a/apps/app_sms.c
+++ b/apps/app_sms.c
@@ -216,6 +216,7 @@ static const unsigned short escapes[] = {
typedef struct sms_s {
unsigned char hangup; /*!< we are done... */
unsigned char err; /*!< set for any errors */
+ unsigned char sent_rel:1; /*!< have sent REL message... */
unsigned char smsc:1; /*!< we are SMSC */
unsigned char rx:1; /*!< this is a received message */
char queue[30]; /*!< queue name */
@@ -1465,6 +1466,7 @@ static void sms_nextoutgoing (sms_t * h)
} else {
h->omsg[0] = 0x94; /* SMS_REL */
h->omsg[1] = 0;
+ h->sent_rel = 1;
}
}
sms_messagetx(h);
@@ -1802,8 +1804,12 @@ static void sms_process(sms_t * h, int samples, signed short *data)
h->iphasep -= 80;
if (h->ibitn++ == 9) { /* end of byte */
if (!bit) { /* bad stop bit */
- ast_log(LOG_NOTICE, "bad stop bit\n");
- h->ierr = 0xFF; /* unknown error */
+ if (h->sent_rel) {
+ h->hangup = 1;
+ } else {
+ ast_log(LOG_NOTICE, "Bad stop bit\n");
+ h->ierr = 0xFF; /* unknown error */
+ }
} else {
if (h->ibytep < sizeof(h->imsg)) {
h->imsg[h->ibytep] = h->ibytev;
@@ -1865,7 +1871,7 @@ static int sms_exec(struct ast_channel *chan, const char *data)
int res = -1;
sms_t h = { 0 };
/* argument parsing support */
- struct ast_flags flags;
+ struct ast_flags flags = { 0 };
char *parse, *sms_opts[OPTION_ARG_ARRAY_SIZE] = { 0, };
char *p;
AST_DECLARE_APP_ARGS(sms_args,