]> granicus.if.org Git - php/commitdiff
Don't try and search a 0-length string. This allows parse_url() to correctly
authorJohn Donagher <jdonagher@php.net>
Fri, 24 Aug 2001 02:21:16 +0000 (02:21 +0000)
committerJohn Donagher <jdonagher@php.net>
Fri, 24 Aug 2001 02:21:16 +0000 (02:21 +0000)
parse a non-pathed URI, i.e. 'scheme://'

ext/standard/url.c

index 4c667d987dbfcae0f54a2488623dd5cf67efefc5..3f1856792ea95075d9d3491942b4838f4bdab2b8 100644 (file)
@@ -114,32 +114,34 @@ PHPAPI php_url *php_url_parse(char *str)
 
                regfree(&re);                   /* free the old regex */
                
-               if ((cerr=regcomp(&re, "^(([^@:]+)(:([^@:]+))?@)?((\\[([^]]+)\\])|([^:@]+))(:([^:@]+))?", REG_EXTENDED))
-                       || (err=regexec(&re, result, 11, subs, 0))) {
-                       STR_FREE(ret->scheme);
-                       STR_FREE(ret->path);
-                       STR_FREE(ret->query);
-                       STR_FREE(ret->fragment);
-                       efree(ret);
-                       efree(result);
-                       /*php_error(E_WARNING, "Unable to compile regex: %d\n", err);*/
-                       if (!cerr) regfree(&re); 
-                       return NULL;
-               }
-               /* now deal with all of the results */
-               if (subs[2].rm_so != -1 && subs[2].rm_so < length) {
-                       ret->user = estrndup(result + subs[2].rm_so, subs[2].rm_eo - subs[2].rm_so);
-               }
-               if (subs[4].rm_so != -1 && subs[4].rm_so < length) {
-                       ret->pass = estrndup(result + subs[4].rm_so, subs[4].rm_eo - subs[4].rm_so);
-               }
-               if (subs[7].rm_so != -1 && subs[7].rm_so < length) {
-                       ret->host = estrndup(result + subs[7].rm_so, subs[7].rm_eo - subs[7].rm_so);
-               } else if (subs[8].rm_so != -1 && subs[8].rm_so < length) {
-                       ret->host = estrndup(result + subs[8].rm_so, subs[8].rm_eo - subs[8].rm_so);
-               }
-               if (subs[10].rm_so != -1 && subs[10].rm_so < length) {
-                       ret->port = (unsigned short) strtol(result + subs[10].rm_so, NULL, 10);
+               if (length) {
+                       if ((cerr=regcomp(&re, "^(([^@:]+)(:([^@:]+))?@)?((\\[([^]]+)\\])|([^:@]+))(:([^:@]+))?", REG_EXTENDED))
+                               || (err=regexec(&re, result, 11, subs, 0))) {
+                               STR_FREE(ret->scheme);
+                               STR_FREE(ret->path);
+                               STR_FREE(ret->query);
+                               STR_FREE(ret->fragment);
+                               efree(ret);
+                               efree(result);
+                               /*php_error(E_WARNING, "Unable to compile regex: %d\n", err);*/
+                               if (!cerr) regfree(&re); 
+                               return NULL;
+                       }
+                       /* now deal with all of the results */
+                       if (subs[2].rm_so != -1 && subs[2].rm_so < length) {
+                               ret->user = estrndup(result + subs[2].rm_so, subs[2].rm_eo - subs[2].rm_so);
+                       }
+                       if (subs[4].rm_so != -1 && subs[4].rm_so < length) {
+                               ret->pass = estrndup(result + subs[4].rm_so, subs[4].rm_eo - subs[4].rm_so);
+                       }
+                       if (subs[7].rm_so != -1 && subs[7].rm_so < length) {
+                               ret->host = estrndup(result + subs[7].rm_so, subs[7].rm_eo - subs[7].rm_so);
+                       } else if (subs[8].rm_so != -1 && subs[8].rm_so < length) {
+                               ret->host = estrndup(result + subs[8].rm_so, subs[8].rm_eo - subs[8].rm_so);
+                       }
+                       if (subs[10].rm_so != -1 && subs[10].rm_so < length) {
+                               ret->port = (unsigned short) strtol(result + subs[10].rm_so, NULL, 10);
+                       }
                }
                efree(result);
        }