[asterisk-commits] rizzo: trunk r45976 - /trunk/channels/chan_sip.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Mon Oct 23 08:08:41 MST 2006
Author: rizzo
Date: Mon Oct 23 10:08:40 2006
New Revision: 45976
URL: http://svn.digium.com/view/asterisk?rev=45976&view=rev
Log:
After reading better the SIP RFC on sip URI (19.1.1)
fix parse_uri() to interpret a missing userinfo
section as a domain-only URI, and comment a wrong
interpretation of the above in check_user_full().
The function has been patched to preserve the existing
behaviour (in what admittedly is a corner case, but
could be received under attacks).
Hopefully the From: based matching will go away soon!
Modified:
trunk/channels/chan_sip.c
Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?rev=45976&r1=45975&r2=45976&view=diff
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Mon Oct 23 10:08:40 2006
@@ -2252,8 +2252,6 @@
char *name = NULL;
int error = 0;
- ast_verbose("-------- parse_uri '%s' ----\n", uri);
-
/* init field as required */
if (*pass)
*pass = NULL;
@@ -2269,21 +2267,29 @@
error = -1;
}
}
- if (domain) {
+ if (!domain) {
+ /* if we don't want to split around domain, keep everything as a name,
+ * so we need to do nothing here, except remember why.
+ */
+ } else {
/* store the result in a temp. variable to avoid it being
* overwritten if arguments point to the same place.
*/
char *c, *dom = NULL;
- if ((c = strchr(name, '@'))) {
+ if ((c = strchr(name, '@')) == NULL) {
+ /* domain-only URI, according to the SIP RFC. */
+ dom = name;
+ name = NULL;
+ } else {
*c++ = '\0';
dom = c;
- if (port && (c = strchr(dom, ':'))) { /* Remove :port */
- *c++ = '\0';
- *port = c;
- }
- }
- if (pass && (c = strchr(name, ':'))) { /* user:password */
+ }
+ if (port && (c = strchr(dom, ':'))) { /* Remove :port */
+ *c++ = '\0';
+ *port = c;
+ }
+ if (name && pass && (c = strchr(name, ':'))) { /* user:password */
*c++ = '\0';
*pass = c;
}
@@ -2293,6 +2299,7 @@
*ret_name = name;
if (options)
*options = uri;
+
return error;
}
@@ -9183,6 +9190,7 @@
{
char from[256];
char *dummy; /* dummy return value for parse_uri */
+ char *domain; /* dummy return value for parse_uri */
char *of;
char rpid_num[50];
const char *rpid;
@@ -9222,8 +9230,17 @@
ast_string_field_set(p, from, of);
/* ignore all fields but name */
- if (parse_uri(of, "sip:", &of, &dummy, &dummy, &dummy, &dummy)) {
+ if (parse_uri(of, "sip:", &of, &dummy, &domain, &dummy, &dummy)) {
ast_log(LOG_NOTICE, "From address missing 'sip:', using it anyway\n");
+ }
+ if (of == NULL) {
+ /* XXX note: the original code considered a missing @host
+ * as a username-only URI. The SIP RFC (19.1.1) says that
+ * this is wrong, and it should be considered as a domain-only URI.
+ * For backward compatibility, we keep this block, but it is
+ * really a mistake and should go away.
+ */
+ of = domain;
}
{
char *tmp = ast_strdupa(of);
More information about the asterisk-commits
mailing list