From 6596f8496e7d715eda66c6cc75d1e086b3966f23 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Mon, 25 Jul 2005 21:40:17 +0000 Subject: _really_ rewrite get_in_brackets to do the right thing (including skipping escaped double-quote characters) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6205 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 55 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 20 deletions(-) (limited to 'channels') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a8c641fa1..8a86a624a 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1321,31 +1321,46 @@ static void url_decode(char *s) *o = '\0'; } -/*--- get_in_brackets: Pick out text in braces from character string ---*/ +/*--- get_in_brackets: Pick out text in brackets from character string ---*/ /* returns pointer to terminated stripped string. modifies input string. */ static char *get_in_brackets(char *tmp) { - char *c = tmp, *n, *q; - - if ((q = strchr(tmp, '"'))) { - c = q + 1; - if ((q = strchr(c, '"')) ) - c = q + 1; - else { - ast_log(LOG_WARNING, "No closing quote in '%s'\n", tmp); - c = tmp; + char *parse; + char *first_quote; + char *first_bracket; + char *second_bracket; + char last_char; + + parse = tmp; + while (1) { + first_quote = strchr(parse, '"'); + first_bracket = strchr(parse, '<'); + if (first_quote && first_bracket && (first_quote < first_bracket)) { + last_char = '\0'; + for (parse = first_quote + 1; *parse; parse++) { + if ((*parse == '"') && (last_char != '\\')) + break; + last_char = *parse; + } + if (!*parse) { + ast_log(LOG_WARNING, "No closing quote found in '%s'\n", tmp); + return tmp; + } + parse++; + continue; } + if (first_bracket) { + second_bracket = strchr(first_bracket + 1, '>'); + if (second_bracket) { + *second_bracket = '\0'; + return first_bracket + 1; + } else { + ast_log(LOG_WARNING, "No closing bracket found in '%s'\n", tmp); + return tmp; + } + } + return tmp; } - if ((n = strchr(c, '<')) ) { - c = n + 1; - while (*c && *c != '>') c++; - if (*c != '>') { - ast_log(LOG_WARNING, "No closing brace in '%s'\n", tmp); - } else - *c = '\0'; - return n+1; - } - return c; } /*--- sip_sendtext: Send SIP MESSAGE text within a call ---*/ -- cgit v1.2.3