*/
/* Skip leading whitespace */
- while(replace_id[0] && (replace_id[0] < 33))
- memmove(replace_id, replace_id+1, strlen(replace_id));
+ replace_id = ast_skip_blanks(replace_id);
+
+ /* XXX there are several bugs in the code below,
+ * because 'ptr' can be NULL so all the dereferences in strcasestr()
+ * would cause panics.
+ * I think we should do something like the code below, which also has
+ * the advantage of not depending on the order of headers.
+ * Please test if it works, and in case remove the block in #else / #endif
+ */
+#if 1 /* proposed replacement */
+ start = replace_id;
+ while ( (ptr = strsep(&start, ";")) ) {
+ ptr = ast_skip_blanks(ptr); /* XXX maybe unnecessary ? */
+ if ( (to = strcasestr(ptr, "to-tag=") ) )
+ totag = to + 7; /* skip the keyword */
+ else if ( (to = strcasestr(ptr, "from-tag=") ) ) {
+ fromtag = to + 9; /* skip the keyword */
+ fromtag = strsep(&fromtag, "&"); /* trim what ? */
+ }
+ }
+#else /* original code, buggy */
if ((ptr = strchr(replace_id, ';'))) {
*ptr = '\0';
ptr++;
totag = ptr;
if ((to = strchr(ptr, ';')))
*to = '\0';
+ /* XXX this code is also wrong as to can be NULL */
to++;
ptr = to;
}
if ((to = strchr(ptr, ';')))
*to = '\0';
}
+#endif
if (sipdebug && option_debug > 3)
ast_log(LOG_DEBUG,"Invite/replaces: Will use Replace-Call-ID : %s Fromtag: %s Totag: %s\n", replace_id, fromtag ? fromtag : "<no from tag>", totag ? totag : "<no to tag>");