aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c2
-rw-r--r--include/asterisk/strings.h7
-rw-r--r--main/utils.c15
3 files changed, 23 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f8b047067..7a95c1d76 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 8b0daab87..76b58d715 100644
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -147,6 +147,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.
\arg src The source string
diff --git a/main/utils.c b/main/utils.c
index a73927e5a..2b87e2b4a 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;