From c6caf2a06fb2e316ac8b23561955ea95f7bc7598 Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Tue, 14 Oct 2008 21:08:48 +0000 Subject: Merged revisions 149130 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r149130 | mmichelson | 2008-10-14 15:49:02 -0500 (Tue, 14 Oct 2008) | 7 lines Don't allow reserved characters to be used in register lines in sip.conf. (closes issue #13570) Reported by: putnopvut ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@149131 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 19e1fafa0..f535e3ed8 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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(®l, 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 */ -- cgit v1.2.3