Merged revisions 149130 via svnmerge from
[asterisk/asterisk.git] / channels / chan_sip.c
index 19e1faf..f535e3e 100644 (file)
@@ -212,6 +212,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #define XMIT_ERROR             -2
 
+#define SIP_RESERVED ";/?:@&=+$,# "
+
 /* #define VOCAL_DATA_HACK */
 
 #define DEFAULT_DEFAULT_EXPIRY  120
@@ -6399,8 +6401,10 @@ static int sip_register(const char *value, int lineno)
        enum sip_transport transport = SIP_TRANSPORT_UDP;
        char buf[256] = "";
        char *username = NULL;
+       char *port = NULL;
        char *hostname=NULL, *secret=NULL, *authuser=NULL, *expire=NULL;
        char *callback=NULL;
+       char *reserved = NULL;
 
        if (!value)
                return -1;
@@ -6425,6 +6429,15 @@ static int sip_register(const char *value, int lineno)
                if (authuser)
                        *authuser++ = '\0';
        }
+       if ((reserved = strpbrk(username, SIP_RESERVED))) {
+               goto invalid_char;
+       }
+       if (!ast_strlen_zero(secret) && (reserved = strpbrk(secret, SIP_RESERVED))) {
+               goto invalid_char;
+       }
+       if (!ast_strlen_zero(authuser) && (reserved = strpbrk(authuser, SIP_RESERVED))) {
+               goto invalid_char;
+       }
        /* split host[:port][/contact] */
        expire = strchr(hostname, '~');
        if (expire)
@@ -6434,6 +6447,19 @@ static int sip_register(const char *value, int lineno)
                *callback++ = '\0';
        if (ast_strlen_zero(callback))
                callback = "s";
+       /* Separate host from port when checking for reserved characters
+        */
+       if ((port = strchr(hostname, ':'))) {
+               *port = '\0';
+       }
+       if ((reserved = strpbrk(hostname, SIP_RESERVED))) {
+               goto invalid_char;
+       }
+       /* And then re-merge the host and port so they are stored correctly
+        */
+       if (port) {
+               *port = ':';
+       }
        if (!(reg = ast_calloc(1, sizeof(*reg)))) {
                ast_log(LOG_ERROR, "Out of memory. Can't allocate SIP registry entry\n");
                return -1;
@@ -6467,6 +6493,10 @@ static int sip_register(const char *value, int lineno)
        ASTOBJ_CONTAINER_LINK(&regl, reg); /* Add the new registry entry to the list */
        registry_unref(reg, "unref the reg pointer");   /* release the reference given by ASTOBJ_INIT. The container has another reference */
        return 0;
+
+invalid_char:
+       ast_log(LOG_WARNING, "A reserved character ('%c') was used in a \"register\" line. This registration will not occur\n", *reserved);
+       return -1;
 }
 
 /*! \brief Parse mwi=> line in sip.conf and add to list */