mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-14 16:33:34 +00:00
use strsep() to trim away ;xxx from SIP messages.
Note that in a couple of places the code overwrites the string in the buffer - mark the two places with XXX but do not fix the bug yet. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@29299 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -5478,7 +5478,7 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init)
|
||||
static int transmit_state_notify(struct sip_pvt *p, int state, int full)
|
||||
{
|
||||
char tmp[4000], from[256], to[256];
|
||||
char *t = tmp, *c, *a, *mfrom, *mto;
|
||||
char *t = tmp, *c, *mfrom, *mto;
|
||||
size_t maxbytes = sizeof(tmp);
|
||||
struct sip_request req;
|
||||
char hint[AST_MAX_EXTENSION];
|
||||
@@ -5547,9 +5547,7 @@ static int transmit_state_notify(struct sip_pvt *p, int state, int full)
|
||||
ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
|
||||
return -1;
|
||||
}
|
||||
if ((a = strchr(c, ';')))
|
||||
*a = '\0';
|
||||
mfrom = c;
|
||||
mfrom = strsep(&c, ";"); /* trim ; and beyond */
|
||||
|
||||
ast_copy_string(to, get_header(&p->initreq, "To"), sizeof(to));
|
||||
c = get_in_brackets(to);
|
||||
@@ -5557,9 +5555,7 @@ static int transmit_state_notify(struct sip_pvt *p, int state, int full)
|
||||
ast_log(LOG_WARNING, "Huh? Not a SIP header (%s)?\n", c);
|
||||
return -1;
|
||||
}
|
||||
if ((a = strchr(c, ';')))
|
||||
*a = '\0';
|
||||
mto = c;
|
||||
mto = strsep(&c, ";"); /* trim ; and beyond */
|
||||
|
||||
reqprep(&req, p, SIP_NOTIFY, 0, 1);
|
||||
|
||||
@@ -6300,9 +6296,7 @@ static int set_address_from_contact(struct sip_pvt *pvt)
|
||||
|
||||
/* Ditch arguments */
|
||||
/* XXX this code is replicated also shortly below */
|
||||
host = strchr(contact, ';');
|
||||
if (host)
|
||||
*host = '\0';
|
||||
contact = strsep(&contact, ";"); /* trim ; and beyond */
|
||||
|
||||
/* Grab host */
|
||||
host = strchr(contact, '@');
|
||||
@@ -6358,9 +6352,8 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
|
||||
if (ast_strlen_zero(expires)) { /* No expires header */
|
||||
expires = strcasestr(get_header(req, "Contact"), ";expires=");
|
||||
if (expires) {
|
||||
char *ptr;
|
||||
if ((ptr = strchr(expires, ';')))
|
||||
*ptr = '\0';
|
||||
/* XXX bug here, we overwrite the string */
|
||||
expires = strsep((char **)&expires, ";"); /* trim ; and beyond */
|
||||
if (sscanf(expires + 9, "%d", &expiry) != 1)
|
||||
expiry = default_expiry;
|
||||
} else {
|
||||
@@ -6370,11 +6363,9 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
|
||||
}
|
||||
/* Look for brackets */
|
||||
ast_copy_string(contact, get_header(req, "Contact"), sizeof(contact));
|
||||
if (strchr(contact, '<') == NULL) { /* No <, check for ; and strip it */
|
||||
char *ptr = strchr(contact, ';'); /* This is Header options, not URI options */
|
||||
if (ptr)
|
||||
*ptr = '\0';
|
||||
}
|
||||
c = contact;
|
||||
if (strchr(contact, '<') == NULL) /* No <, check for ; and strip it */
|
||||
strsep(&c, ";"); /* This is Header options, not URI options */
|
||||
c = get_in_brackets(contact);
|
||||
|
||||
/* if they did not specify Contact: or Expires:, they are querying
|
||||
@@ -6415,10 +6406,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st
|
||||
} else
|
||||
c += 4;
|
||||
/* Ditch q */
|
||||
n = strchr(c, ';');
|
||||
if (n) {
|
||||
*n = '\0';
|
||||
}
|
||||
c = strsep(&c, ";");
|
||||
/* Grab host */
|
||||
n = strchr(c, '@');
|
||||
if (!n) {
|
||||
@@ -6825,10 +6813,7 @@ static int register_verify(struct sip_pvt *p, struct sockaddr_in *sin, struct si
|
||||
ast_uri_decode(tmp);
|
||||
|
||||
c = get_in_brackets(tmp);
|
||||
/* Ditch ;user=phone */
|
||||
name = strchr(c, ';');
|
||||
if (name)
|
||||
*name = '\0';
|
||||
c = strsep(&c, ";"); /* Ditch ;user=phone */
|
||||
|
||||
if (!strncmp(c, "sip:", 4)) {
|
||||
name = c + 4;
|
||||
@@ -7024,8 +7009,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
||||
return -1;
|
||||
}
|
||||
from += 4;
|
||||
if ((a = strchr(from, ';')))
|
||||
*a = '\0';
|
||||
from = strsep(&from, ";");
|
||||
if ((a = strchr(from, '@'))) {
|
||||
*a = '\0';
|
||||
ast_string_field_set(p, fromdomain, a + 1);
|
||||
@@ -7034,8 +7018,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
|
||||
}
|
||||
|
||||
/* Skip any options and find the domain */
|
||||
if ((a = strchr(uri, ';')))
|
||||
*a = '\0';
|
||||
uri = strsep(&uri, ";");
|
||||
|
||||
/* Get the target domain */
|
||||
if ((a = strchr(uri, '@'))) {
|
||||
@@ -9973,9 +9956,7 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req)
|
||||
|
||||
ast_copy_string(tmp, get_header(req, "Contact"), sizeof(tmp));
|
||||
s = get_in_brackets(tmp);
|
||||
e = strchr(s, ';');
|
||||
if (e)
|
||||
*e = '\0';
|
||||
s = strsep(&s, ";"); /* strip ; and beyond */
|
||||
if (ast_test_flag(&p->flags[0], SIP_PROMISCREDIR)) {
|
||||
if (!strncasecmp(s, "sip:", 4))
|
||||
s += 4;
|
||||
@@ -10980,13 +10961,9 @@ static const char *gettag(const struct sip_request *req, char *header, char *tag
|
||||
thetag = get_header(req, header);
|
||||
thetag = strcasestr(thetag, ";tag=");
|
||||
if (thetag) {
|
||||
char *sep;
|
||||
thetag += 5;
|
||||
ast_copy_string(tagbuf, thetag, tagbufsize);
|
||||
sep = strchr(tagbuf, ';');
|
||||
if (sep)
|
||||
*sep = '\0';
|
||||
return tagbuf;
|
||||
return strsep(&tagbuf, ";");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -11624,7 +11601,6 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
|
||||
struct sip_peer *authpeer = NULL;
|
||||
const char *event = get_header(req, "Event"); /* Get Event package name */
|
||||
const char *accept = get_header(req, "Accept");
|
||||
char *eventparam;
|
||||
int resubscribe = (p->subscribed != NONE);
|
||||
|
||||
if (p->initreq.headers) {
|
||||
@@ -11666,8 +11642,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
|
||||
ast_verbose("Ignoring this SUBSCRIBE request\n");
|
||||
|
||||
/* Find parameters to Event: header value and remove them for now */
|
||||
if ((eventparam = strchr(event, ';')))
|
||||
*eventparam++ = '\0';
|
||||
event = strsep((char **)&event, ";"); /* XXX bug here, overwrite string */
|
||||
|
||||
/* Handle authentication if this is our first subscribe */
|
||||
res = check_user_full(p, req, SIP_SUBSCRIBE, e, 0, sin, &authpeer);
|
||||
|
Reference in New Issue
Block a user