瀏覽代碼

modules_k:siptrace fixed function pipport2su. (error if url doesn't have port)
Thanks David Kovarik for report.

Alexandr Dubovikov 13 年之前
父節點
當前提交
830544e5b3
共有 1 個文件被更改,包括 31 次插入23 次删除
  1. 31 23
      modules_k/siptrace/siptrace.c

+ 31 - 23
modules_k/siptrace/siptrace.c

@@ -1648,6 +1648,7 @@ static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int
 	char *p, *host_s;
 	str port_str, host_uri;
 	unsigned len = 0;
+	char tmp_piport[256];
 
 	/*parse protocol */
 	if(strncmp(pipport, "udp:",4) == 0) *proto = IPPROTO_UDP;
@@ -1661,42 +1662,49 @@ static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int
 		LM_ERR("bad protocol %s\n", pipport);
 		return -1;
 	}
+	
+	if((len = strlen(pipport)) > 256) {
+		LM_ERR("too big pipport\n");
+		goto error;
+	}
+
+	/* our tmp string */
+        strncpy(tmp_piport, pipport, len);
+
+	len = 0;
 
 	/*separate proto and host */
-	p = pipport+cutlen;
+	p = tmp_piport+cutlen;
 	if( (*(p)) == '\0') {
 		LM_ERR("malformed ip address\n");
-		return -1;
+		goto error;
 	}
 	host_s=p;
 
 	if( (p = strrchr(p+1, ':')) == 0 ) {
-		LM_ERR("no port specified\n");
-		return -1;
-	}
-	/*the address contains a port number*/
-	*p = '\0';
-	p++;
-	port_str.s = p;
-	port_str.len = strlen(p);
-	LM_DBG("the port string is %s\n", p);
-	if(str2int(&port_str, &port_no) != 0 ) {
-		LM_ERR("there is not a valid number port\n");
-		return -1;
-	}
-	*p = '\0';
-	if (port_no<1024  || port_no>65536)
-	{
-		LM_ERR("invalid port number; must be in [1024,65536]\n");
-		return -1;
+		LM_DBG("no port specified\n");
+		port_no = 0;
 	}
-
+	else {
+        	/*the address contains a port number*/
+        	*p = '\0';
+        	p++;
+        	port_str.s = p;
+        	port_str.len = strlen(p);
+        	LM_DBG("the port string is %s\n", p);
+        	if(str2int(&port_str, &port_no) != 0 ) {
+	        	LM_ERR("there is not a valid number port\n");
+	        	goto error;
+        	}
+        	*p = '\0';
+        }
+        
 	/* now IPv6 address has no brakets. It should be fixed! */
 	if (host_s[0] == '[') {
 		len = strlen(host_s + 1) - 1;
 		if(host_s[len+1] != ']') {
 			LM_ERR("bracket not closed\n");
-			return -1;
+			goto error;
 		}
 		memmove(host_s, host_s + 1, len);
 		host_s[len] = '\0';
@@ -1705,7 +1713,6 @@ static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int
 	host_uri.s = host_s;
 	host_uri.len = strlen(host_s);
 
-
 	/* check if it's an ip address */
 	if (((ip=str2ip(&host_uri))!=0)
 #ifdef  USE_IPV6
@@ -1717,5 +1724,6 @@ static int pipport2su (char *pipport, union sockaddr_union *tmp_su, unsigned int
 
 	}
 
+error:
 	return -1;
 }