tomh / rpms / asterisk

Forked from rpms/asterisk 6 years ago
Clone
Blob Blame History Raw
From 27281c691ee1b1c632fcfd8c99f7b4a2d9fa8921 Mon Sep 17 00:00:00 2001
From: David Woodhouse <dwmw2@infradead.org>
Date: Tue, 20 Sep 2011 09:21:47 -0500
Subject: [PATCH 8/9] Fix two problems with app_sms.

Firstly, the 'flags' field on the stack in sms_exec() is
uninitialised, causing it to use the wrong protocol in some cases.

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.
---
 apps/app_sms.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/apps/app_sms.c b/apps/app_sms.c
index 08b90d1..b6c4ade 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 */
@@ -1464,6 +1465,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);
@@ -1801,8 +1803,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;
@@ -1864,7 +1870,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,
-- 
1.7.12.1