From: John Donagher Date: Fri, 24 Aug 2001 02:21:16 +0000 (+0000) Subject: Don't try and search a 0-length string. This allows parse_url() to correctly X-Git-Tag: PRE_SUBST_Z_MACROS~377 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=faa5031f2521bf5e842fed1b09669c1d755fbd0e;p=php Don't try and search a 0-length string. This allows parse_url() to correctly parse a non-pathed URI, i.e. 'scheme://' --- diff --git a/ext/standard/url.c b/ext/standard/url.c index 4c667d987d..3f1856792e 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -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); }