1
0
mirror of https://github.com/php/php-src.git synced 2026-04-26 09:28:21 +02:00

Don't try and search a 0-length string. This allows parse_url() to correctly

parse a non-pathed URI, i.e. 'scheme://'
This commit is contained in:
John Donagher
2001-08-24 02:21:16 +00:00
parent bd4eb1bf78
commit faa5031f25
+28 -26
View 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);
}