diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-28 18:49:00 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-28 18:49:00 +0000 |
commit | ab9e7f733868a4c73c636168823781153e11cb3f (patch) | |
tree | 7390c9cd3ea2bfd40adc6a5b4e3ac40594e31cfe /channels | |
parent | c4d69251f5a82094b73987955f98ec3bfe24c0af (diff) |
Make a copy of the request URI in check_user_full instead of modifying the one on the structure, and also strip params properly from the user portion of the SIP URI so as to preserve the domain (issue #7552 reported by dan42)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@38420 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index d9ce9afdd..2697f71e8 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -6633,7 +6633,7 @@ static int get_rdnis(struct sip_pvt *p, struct sip_request *oreq) /*! \brief get_destination: Find out who the call is for --*/ static int get_destination(struct sip_pvt *p, struct sip_request *oreq) { - char tmp[256] = "", *uri, *a; + char tmp[256] = "", *uri, *a, *b; char tmpf[256], *from; struct sip_request *req; char *colon; @@ -6670,15 +6670,17 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq) /* Skip any options */ if ((a = strchr(uri, ';'))) { - *a = '\0'; + *a++ = '\0'; + b = a; + } else { + b = uri; } - + /* Get the target domain */ - if ((a = strchr(uri, '@'))) { - *a = '\0'; - a++; + if ((a = strchr(b, '@'))) { + *a++ = '\0'; } else { /* No username part */ - a = uri; + a = b; uri = "s"; /* Set extension to "s" */ } colon = strchr(a, ':'); /* Remove :port */ @@ -7081,9 +7083,10 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme char calleridname[50]; int debug=sip_debug_test_addr(sin); struct ast_variable *tmpvar = NULL, *v = NULL; + char *uri2 = ast_strdupa(uri); /* Terminate URI */ - t = uri; + t = uri2; while(*t && (*t > 32) && (*t != ';')) t++; *t = '\0'; @@ -7105,7 +7108,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme of = get_in_brackets(from); if (ast_strlen_zero(p->exten)) { - t = uri; + t = uri2; if (!strncmp(t, "sip:", 4)) t+= 4; ast_copy_string(p->exten, t, sizeof(p->exten)); @@ -7162,7 +7165,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)); ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE)); } - if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), user->name, user->secret, user->md5secret, sipmethod, uri, reliable, ignore))) { + if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), user->name, user->secret, user->md5secret, sipmethod, uri2, reliable, ignore))) { sip_cancel_destroy(p); ast_copy_flags(p, user, SIP_FLAGS_TO_COPY); /* Copy SIP extensions profile from INVITE */ @@ -7262,7 +7265,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme p->peersecret[0] = '\0'; p->peermd5secret[0] = '\0'; } - if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), peer->name, p->peersecret, p->peermd5secret, sipmethod, uri, reliable, ignore))) { + if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), peer->name, p->peersecret, p->peermd5secret, sipmethod, uri2, reliable, ignore))) { ast_copy_flags(p, peer, SIP_FLAGS_TO_COPY); /* If we have a call limit, set flag */ if (peer->call_limit) @@ -7323,7 +7326,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme #ifdef OSP_SUPPORT } else if (global_allowguest == 2) { ast_copy_flags(p, &global_flags, SIP_OSPAUTH); - res = check_auth(p, req, p->randdata, sizeof(p->randdata), "", "", "", sipmethod, uri, reliable, ignore); + res = check_auth(p, req, p->randdata, sizeof(p->randdata), "", "", "", sipmethod, uri2, reliable, ignore); #endif } } |