diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-25 21:40:17 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2005-07-25 21:40:17 +0000 |
commit | 1e631a97f18f7c75a0431f9f118ce25c7c93250e (patch) | |
tree | 4b46efb87e5a59c7187faa9ddfe180984312249f /channels | |
parent | 9bdf97f2c6d074801a7f7ea48d90239ab7c96c0c (diff) |
_really_ rewrite get_in_brackets to do the right thing (including skipping escaped double-quote characters)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6205 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-x | channels/chan_sip.c | 55 |
1 files changed, 35 insertions, 20 deletions
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 ---*/ |