Subject: app_sms: BufferOverflow when receiving odd length 16 bit message
From: Scott Griepentrog <sgriepentrog@digium.com>
Date: Mon, 16 Dec 2013 15:18:56 +0000
Origin: http://svnview.digium.com/svn/asterisk?view=rev&rev=403853
Bug: https://issues.asterisk.org/jira/browse/ASTERISK-22590

This patch prevents an infinite loop overwriting memory when
a message is received into the unpacksms16() function, where
the length of the message is an odd number of bytes.

---
 apps/app_sms.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/apps/app_sms.c b/apps/app_sms.c
index 08b90d1..75d399a 100644
--- a/apps/app_sms.c
+++ b/apps/app_sms.c
@@ -696,7 +696,7 @@ static void unpacksms16(unsigned char *i, unsigned char l, unsigned char *udh, i
 	}
 	while (l--) {
 		int v = *i++;
-		if (l--) {
+		if (l && l--) {
 			v = (v << 8) + *i++;
 		}
 		*o++ = v;
@@ -714,6 +714,7 @@ static int unpacksms(unsigned char dcs, unsigned char *i, unsigned char *udh, in
 	} else if (is8bit(dcs)) {
 		unpacksms8(i, l, udh, udhl, ud, udl, udhi);
 	} else {
+		l += l % 2;
 		unpacksms16(i, l, udh, udhl, ud, udl, udhi);
 	}
 	return l + 1;
-- 
1.7.10.4

