From f1cb3f70b787317af62f20bc3a2e0d6af07c19ec Mon Sep 17 00:00:00 2001 From: Jason Parker Date: Fri, 17 Aug 2007 19:12:19 +0000 Subject: [PATCH] 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/branches/1.4@79904 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 9b41cd6802..9bdc60e2da 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11120,7 +11120,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 */ if (ast_sip_ouraddrfor(&p->sa.sin_addr, &p->ourip)) diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h index fad6f27825..68ecb20489 100644 --- a/include/asterisk/strings.h +++ b/include/asterisk/strings.h @@ -141,6 +141,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. \param ast_copy_string function being used diff --git a/main/utils.c b/main/utils.c index 8b2b86694c..56d3ffe85f 100644 --- a/main/utils.c +++ b/main/utils.c @@ -880,6 +880,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;