Skip to content

Commit 449fda3

Browse files
committed
A few fixes and improvements after feedback
1 parent aafa027 commit 449fda3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+374
-531
lines changed

Zend/zend_string.h

+1
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
598598
_(ZEND_STR_PORT, "port") \
599599
_(ZEND_STR_USERINFO, "userinfo") \
600600
_(ZEND_STR_USER, "user") \
601+
_(ZEND_STR_USERNAME, "username") \
601602
_(ZEND_STR_PASS, "pass") \
602603
_(ZEND_STR_PASSWORD, "password") \
603604
_(ZEND_STR_PATH, "path") \

ext/filter/logical_filters.c

+2-7
Original file line numberDiff line numberDiff line change
@@ -620,28 +620,23 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
620620

621621
if (uri->scheme != NULL &&
622622
(zend_string_equals_literal_ci(uri->scheme, "http") || zend_string_equals_literal_ci(uri->scheme, "https"))) {
623-
const char *s;
624-
size_t l;
625623

626624
if (uri->host == NULL) {
627625
php_uri_struct_free(uri);
628626
RETURN_VALIDATION_FAILED
629627
}
630628

631-
s = ZSTR_VAL(uri->host);
632-
l = ZSTR_LEN(uri->host);
633-
634629
if (
635630
/* @todo Find a better solution than hardcoding the uri handler name. Skipping these checks is needed because
636631
* both uriparser and lexbor performs comprehensive validations. Also, the [] pair is removed by these
637632
* libraries in case of ipv6 URIs, therefore php_filter_is_valid_ipv6_hostname() would case false positive
638633
* failures. */
639634
strcmp(uri_handler->name, "parse_url") == 0 &&
640635
/* An IPv6 enclosed by square brackets is a valid hostname.*/
641-
!php_filter_is_valid_ipv6_hostname(url->host) &&
636+
!php_filter_is_valid_ipv6_hostname(uri->host) &&
642637
/* Validate domain.
643638
* This includes a loose check for an IPv4 address. */
644-
!_php_filter_validate_domain(ZSTR_VAL(uri->host), l, FILTER_FLAG_HOSTNAME)
639+
!php_filter_validate_domain_ex(uri->host, FILTER_FLAG_HOSTNAME)
645640
) {
646641
php_uri_struct_free(uri);
647642
RETURN_VALIDATION_FAILED

ext/standard/url.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ static zend_result parse_url_read_scheme(const uri_internal_t *internal_uri, uri
337337
return SUCCESS;
338338
}
339339

340-
static zend_result parse_url_read_user(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
340+
static zend_result parse_url_read_username(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
341341
{
342342
php_url *parse_url_uri = (php_url *) internal_uri->uri;
343343

@@ -433,7 +433,7 @@ static zend_result parse_url_init_parser(void)
433433
zend_hash_init(&parse_url_property_handlers, 8, NULL, NULL, true);
434434

435435
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_SCHEME), parse_url_read_scheme);
436-
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_USER), parse_url_read_user);
436+
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_USER), parse_url_read_username);
437437
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_PASSWORD), parse_url_read_password);
438438
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_HOST), parse_url_read_host);
439439
URI_REGISTER_PROPERTY_READ_HANDLER(&parse_url_property_handlers, ZSTR_KNOWN(ZEND_STR_PORT), parse_url_read_port);
@@ -458,6 +458,19 @@ static void *parse_url_parse_uri(const zend_string *uri_str, const zend_string *
458458
return php_url_parse_ex2(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str), &has_port);
459459
}
460460

461+
static void parse_url_create_invalid_url_exception(zval *exception_zv, zval *errors)
462+
{
463+
object_init_ex(exception_zv, invalid_uri_exception_ce);
464+
465+
zend_update_property_string(
466+
invalid_uri_exception_ce,
467+
Z_OBJ_P(exception_zv),
468+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_MESSAGE)),
469+
ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_MESSAGE)),
470+
"URI parsing failed"
471+
);
472+
}
473+
461474
static zend_string *parse_url_uri_to_string(void *uri, uri_recomposition_mode_t recomposition_mode, bool exclude_fragment)
462475
{
463476
ZEND_UNREACHABLE();
@@ -474,6 +487,7 @@ const uri_handler_t parse_url_uri_handler = {
474487
"parse_url",
475488
parse_url_init_parser,
476489
parse_url_parse_uri,
490+
parse_url_create_invalid_url_exception,
477491
parse_url_clone_uri,
478492
parse_url_uri_to_string,
479493
parse_url_free_uri,

ext/uri/php_lexbor.c

+29-14
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
static zend_result lexbor_init_parser(void);
2727
static void *lexbor_parse_uri(const zend_string *url_str, const zend_string *base_url_str, zval *errors);
28+
static void lexbor_create_invalid_uri_exception(zval *exception_zv, zval *errors);
2829
static void *lexbor_clone_uri(void *uri);
2930
static zend_string *lexbor_uri_to_string(void *uri, uri_recomposition_mode_t recomposition_mode, bool exclude_fragment);
3031
static void lexbor_free_uri(void *uri);
@@ -39,6 +40,7 @@ const uri_handler_t lexbor_uri_handler = {
3940
URI_PARSER_WHATWG,
4041
lexbor_init_parser,
4142
lexbor_parse_uri,
43+
lexbor_create_invalid_uri_exception,
4244
lexbor_clone_uri,
4345
lexbor_uri_to_string,
4446
lexbor_free_uri,
@@ -284,7 +286,7 @@ static zend_result lexbor_write_scheme(uri_internal_t *internal_uri, zval *value
284286
CHECK_WRITE_RESULT(status, lexbor_uri, str, errors);
285287
}
286288

287-
static zend_result lexbor_read_user(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
289+
static zend_result lexbor_read_username(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
288290
{
289291
lxb_url_t *lexbor_uri = (lxb_url_t *) internal_uri->uri;
290292

@@ -297,7 +299,7 @@ static zend_result lexbor_read_user(const uri_internal_t *internal_uri, uri_comp
297299
return SUCCESS;
298300
}
299301

300-
static zend_result lexbor_write_user(uri_internal_t *internal_uri, zval *value, zval *errors)
302+
static zend_result lexbor_write_username(uri_internal_t *internal_uri, zval *value, zval *errors)
301303
{
302304
lxb_url_t *lexbor_uri = (lxb_url_t *) internal_uri->uri;
303305
lexbor_str_t str = {0};
@@ -339,22 +341,19 @@ static zend_result lexbor_read_host(const uri_internal_t *internal_uri, uri_comp
339341
lxb_url_t *lexbor_uri = (lxb_url_t *) internal_uri->uri;
340342

341343
if (lexbor_uri->host.type == LXB_URL_HOST_TYPE_IPV4) {
342-
struct in_addr myaddr;
343-
myaddr.s_addr = htonl((zend_ulong) &lexbor_uri->host.u.ipv4);
344-
char buffer[17];
344+
smart_str host_str = {0};
345345

346-
const char* result = inet_ntop(AF_INET, &myaddr, buffer, sizeof(buffer));
347-
ZEND_ASSERT(result != NULL);
346+
lxb_url_serialize_host_ipv4((zend_ulong) lexbor_uri->host.u.ipv4, lexbor_serialize_callback, (void *) &host_str);
348347

349-
ZVAL_STRING(retval, buffer);
348+
ZVAL_STR(retval, smart_str_extract(&host_str));
350349
} else if (lexbor_uri->host.type == LXB_URL_HOST_TYPE_IPV6) {
351-
char buffer[46];
350+
smart_str host_str = {0};
352351

353-
php_sprintf(buffer, "[%hu:%hu:%hu:%hu:%hu:%hu:%hu:%hu]", lexbor_uri->host.u.ipv6[0], lexbor_uri->host.u.ipv6[1],
354-
lexbor_uri->host.u.ipv6[2], lexbor_uri->host.u.ipv6[3], lexbor_uri->host.u.ipv6[4], lexbor_uri->host.u.ipv6[5],
355-
lexbor_uri->host.u.ipv6[6], lexbor_uri->host.u.ipv6[7]);
352+
smart_str_appendc(&host_str, '[');
353+
lxb_url_serialize_host_ipv6(lexbor_uri->host.u.ipv6, lexbor_serialize_callback, (void *) &host_str);
354+
smart_str_appendc(&host_str, ']');
356355

357-
ZVAL_STRING(retval, buffer);
356+
ZVAL_STR(retval, smart_str_extract(&host_str));
358357
} else if (lexbor_uri->host.type != LXB_URL_HOST_TYPE_EMPTY && lexbor_uri->host.type != LXB_URL_HOST_TYPE__UNDEF) {
359358

360359
switch (read_mode) {
@@ -522,7 +521,7 @@ static zend_result lexbor_init_parser(void)
522521
zend_hash_init(&lexbor_property_handlers, 8, NULL, NULL, true);
523522

524523
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_SCHEME), lexbor_read_scheme, lexbor_write_scheme);
525-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_USER), lexbor_read_user, lexbor_write_user);
524+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_USERNAME), lexbor_read_username, lexbor_write_username);
526525
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PASSWORD), lexbor_read_password, lexbor_write_password);
527526
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_HOST), lexbor_read_host, lexbor_write_host);
528527
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PORT), lexbor_read_port, lexbor_write_port);
@@ -552,6 +551,22 @@ static void *lexbor_parse_uri(const zend_string *url_str, const zend_string *bas
552551
return url;
553552
}
554553

554+
static void lexbor_create_invalid_uri_exception(zval *exception_zv, zval *errors)
555+
{
556+
object_init_ex(exception_zv, whatwg_invalid_url_exception_ce);
557+
558+
zend_update_property_string(
559+
whatwg_invalid_url_exception_ce,
560+
Z_OBJ_P(exception_zv),
561+
ZSTR_VAL(ZSTR_KNOWN(ZEND_STR_MESSAGE)),
562+
ZSTR_LEN(ZSTR_KNOWN(ZEND_STR_MESSAGE)),
563+
"URL parsing failed"
564+
);
565+
566+
zend_update_property(whatwg_invalid_url_exception_ce, Z_OBJ_P(exception_zv), "errors", sizeof("errors") - 1, errors);
567+
}
568+
569+
555570
static void *lexbor_clone_uri(void *uri)
556571
{
557572
lxb_url_t *lexbor_uri = (lxb_url_t *) uri;

0 commit comments

Comments
 (0)