From 100e2387db5157b70ff95d533a6b8b1eab36a150 Mon Sep 17 00:00:00 2001
From: Jason Parker <jparker@digium.com>
Date: Fri, 17 Aug 2007 19:13:25 +0000
Subject: [PATCH] Merged revisions 79904 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.4

(closes issue #10430)
........
r79904 | qwell | 2007-08-17 14:12:19 -0500 (Fri, 17 Aug 2007) | 11 lines

Don't send a semicolon over the wire in sip notify messages.
Caused by fix for issue 9938.

I basically took the code that existed before 9938 was fixed, and
 copied it into a new function - ast_unescape_semicolon

There should be very few places this will be needed (pbx_config
 does NOT need this (see issue 9938 for details))

Issue 10430, patch by me, with help/ideas from murf (thanks murf).

........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@79905 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c        |  2 +-
 include/asterisk/strings.h |  7 +++++++
 main/utils.c               | 15 +++++++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f8b0470670..7a95c1d765 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -12310,7 +12310,7 @@ static int sip_notify(int fd, int argc, char *argv[])
 		initreqprep(&req, p, SIP_NOTIFY);
 
 		for (var = varlist; var; var = var->next)
-			add_header(&req, var->name, var->value);
+			add_header(&req, var->name, ast_unescape_semicolon(var->value));
 
 		/* Recalculate our side, and recalculate Call ID */
 		ast_sip_ouraddrfor(&p->sa.sin_addr, &p->ourip);
diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h
index 8b0daab87b..76b58d7150 100644
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -146,6 +146,13 @@ char *ast_strip(char *s),
  */
 char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes);
 
+/*!
+  \brief Strip backslash for "escaped" semicolons.
+  \brief s The string to be stripped (will be modified).
+  \return The stripped string.
+ */
+char *ast_unescape_semicolon(char *s);
+
 /*!
   \brief Size-limited null-terminating string copy.
   \arg dst The destination buffer.
diff --git a/main/utils.c b/main/utils.c
index a73927e5ac..2b87e2b4a4 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -935,6 +935,21 @@ char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
 	return s;
 }
 
+char *ast_unescape_semicolon(char *s)
+{
+	char *e;
+	char *work = s;
+
+	while ((e = strchr(work, ';'))) {
+		if ((e > work) && (*(e-1) == '\\')) {
+			memmove(e - 1, e, strlen(e) + 1);
+			work = e;
+		}
+	}
+
+	return s;
+}
+
 int ast_build_string_va(char **buffer, size_t *space, const char *fmt, va_list ap)
 {
 	int result;
-- 
GitLab