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:
+28
-26
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user