changeset 11771:827cae571c5c

Fix long standing bug where last (and sometimes first) char of the hostname got ripped. Also fix url unescaping with hex A ... F
author albeu
date Sat, 10 Jan 2004 14:38:07 +0000
parents be23eda3175e
children a28415f654b8
files libmpdemux/url.c m_option.c
diffstat 2 files changed, 15 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/url.c	Sat Jan 10 13:25:39 2004 +0000
+++ b/libmpdemux/url.c	Sat Jan 10 14:38:07 2004 +0000
@@ -14,9 +14,9 @@
 
 URL_t*
 url_new(const char* url) {
-	int pos1, pos2;
+	int pos1, pos2,v6addr = 0;
 	URL_t* Curl;
-	char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL;
+	char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL, *ptr4=NULL;
 	int jumpSize = 3;
 
 	if( url==NULL ) return NULL;
@@ -106,11 +106,13 @@
 	// in IPv6 URL the numeric address should be inside square braces.
 	ptr2 = strstr(ptr1, "[");
 	ptr3 = strstr(ptr1, "]");
-	if( ptr2!=NULL && ptr3!=NULL ) {
+	ptr4 = strstr(ptr1, "/");
+	if( ptr2!=NULL && ptr3!=NULL && ptr2 < ptr3 && (!ptr4 || ptr4 > ptr3)) {
 		// we have an IPv6 numeric address
 		ptr1++;
 		pos1++;
 		ptr2 = ptr3;
+		v6addr = 1;
 	} else {
 		ptr2 = ptr1;
 
@@ -138,7 +140,7 @@
 		Curl->port = atoi(ptr2+1);
 		pos2 = ptr2-url;
 	}
-	if( strstr(ptr1, "]")!=NULL ) pos2--;
+	if( v6addr ) pos2--;
 	// copy the hostname in the URL container
 	Curl->hostname = (char*)malloc(pos2-pos1+1);
 	if( Curl->hostname==NULL ) {
@@ -206,9 +208,9 @@
 			if (	((c1>='0' && c1<='9') || (c1>='A' && c1<='F')) &&
 				((c2>='0' && c2<='9') || (c2>='A' && c2<='F')) ) {
 				if (c1>='0' && c1<='9') c1-='0';
-				else c1-='A';
+				else c1-='A'-10;
 				if (c2>='0' && c2<='9') c2-='0';
-				else c2-='A';
+				else c2-='A'-10;
 				c = (c1<<4) + c2;
 			}
 		}
--- a/m_option.c	Sat Jan 10 13:25:39 2004 +0000
+++ b/m_option.c	Sat Jan 10 14:38:07 2004 +0000
@@ -1595,8 +1595,8 @@
 
 static int parse_custom_url(m_option_t* opt,char *name,
 			    char *url, void* dst, int src) {
-  int pos1, pos2, r;
-  char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL;
+  int pos1, pos2, r, v6addr = 0;
+  char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL, *ptr4=NULL;
   m_struct_t* desc = opt->priv;
   
   if(!desc) {
@@ -1688,11 +1688,14 @@
   // in an IPv6 URL the numeric address should be inside square braces.
   ptr2 = strstr(ptr1, "[");
   ptr3 = strstr(ptr1, "]");
-  if( ptr2!=NULL && ptr3!=NULL ) {
+  // If the [] is after the first it isn't the hostname
+  ptr4 = strstr(ptr1, "/");
+  if( ptr2!=NULL && ptr3!=NULL && (ptr2 < ptr3) && (!ptr4 || ptr4 > ptr3)) {
     // we have an IPv6 numeric address
     ptr1++;
     pos1++;
     ptr2 = ptr3;
+    v6addr = 1;
   } else {
     ptr2 = ptr1;  
   }
@@ -1733,7 +1736,7 @@
     }
     pos2 = ptr2-url;
   }
-  if( strstr(ptr1, "]")!=NULL ) pos2--;
+  if( v6addr ) pos2--;
   // Get the hostname
   if(pos2-pos1 > 0) {
     if(!m_option_list_find(desc->fields,"hostname")) {