[asterisk-commits] mmichelson: trunk r351288 - in /trunk: ./ channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jan 17 10:56:06 CST 2012
Author: mmichelson
Date: Tue Jan 17 10:56:04 2012
New Revision: 351288
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=351288
Log:
Use built-in parsing functions for Contact and Record-Route headers.
If a Contact or a Record-Route header had a quoted string with an
item in angle brackets, then we would mis-parse it. For instance,
"Bob <1234>" <1234 at example.org>
would be misparsed as having the URI "1234"
The fix for this is to use parsing functions from reqresp_parser.h
since they are heavily tested and are awesome.
(issue ASTERISK-18990)
........
Merged revisions 351284 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 351286 from http://svn.asterisk.org/svn/asterisk/branches/10
Modified:
trunk/ (props changed)
trunk/channels/chan_sip.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-10-merged' - no diff available.
Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=351288&r1=351287&r2=351288
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Tue Jan 17 10:56:04 2012
@@ -14384,7 +14384,7 @@
struct sip_route *thishop, *head, *tail;
int start = 0;
int len;
- const char *rr, *contact, *c;
+ const char *rr, *c;
/* Once a persistent route is set, don't fool with it */
if (p->route && p->route_persistent) {
@@ -14410,17 +14410,22 @@
/* 1st we pass through all the hops in any Record-Route headers */
for (;;) {
/* Each Record-Route header */
+ char rr_copy[256];
+ char *rr_copy_ptr;
+ char *rr_iter;
rr = __get_header(req, "Record-Route", &start);
if (*rr == '\0') {
break;
}
- for (; (rr = strchr(rr, '<')) ; rr += len) { /* Each route entry */
- ++rr;
- len = strcspn(rr, ">") + 1;
+ ast_copy_string(rr_copy, rr, sizeof(rr_copy));
+ rr_copy_ptr = rr_copy;
+ while ((rr_iter = strsep(&rr_copy_ptr, ","))) { /* Each route entry */
+ char *uri = get_in_brackets(rr_iter);
+ len = strlen(uri) + 1;
/* Make a struct route */
if ((thishop = ast_malloc(sizeof(*thishop) + len))) {
/* ast_calloc is not needed because all fields are initialized in this block */
- ast_copy_string(thishop->hop, rr, len);
+ ast_copy_string(thishop->hop, uri, len);
ast_debug(2, "build_route: Record-Route hop: <%s>\n", thishop->hop);
/* Link in */
if (backwards) {
@@ -14449,20 +14454,12 @@
if (!head || (!ast_strlen_zero(head->hop) && strstr(head->hop, ";lr") == NULL) ) {
/* 2nd append the Contact: if there is one */
/* Can be multiple Contact headers, comma separated values - we just take the first */
- contact = sip_get_header(req, "Contact");
+ char *contact = ast_strdupa(sip_get_header(req, "Contact"));
if (!ast_strlen_zero(contact)) {
ast_debug(2, "build_route: Contact hop: %s\n", contact);
/* Look for <: delimited address */
- c = strchr(contact, '<');
- if (c) {
- /* Take to > */
- ++c;
- len = strcspn(c, ">") + 1;
- } else {
- /* No <> - just take the lot */
- c = contact;
- len = strlen(contact) + 1;
- }
+ c = get_in_brackets(contact);
+ len = strlen(c) + 1;
if ((thishop = ast_malloc(sizeof(*thishop) + len))) {
/* ast_calloc is not needed because all fields are initialized in this block */
ast_copy_string(thishop->hop, c, len);
More information about the asterisk-commits
mailing list