Skip to content

Commit b3a48bf

Browse files
committed
Updates
1 parent b485171 commit b3a48bf

Some content is hidden

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

44 files changed

+398
-295
lines changed

Zend/zend_string.h

+1
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
596596
_(ZEND_STR_SCHEME, "scheme") \
597597
_(ZEND_STR_HOST, "host") \
598598
_(ZEND_STR_PORT, "port") \
599+
_(ZEND_STR_USERINFO, "userinfo") \
599600
_(ZEND_STR_USER, "user") \
600601
_(ZEND_STR_PASS, "pass") \
601602
_(ZEND_STR_PASSWORD, "password") \

ext/filter/logical_filters.c

+22-87
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,6 @@ static bool php_filter_is_valid_ipv6_hostname(const zend_string *s)
592592

593593
void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
594594
{
595-
zend_result result;
596595
size_t old_len = Z_STRLEN_P(value);
597596

598597
php_filter_url(value, flags, option_array, charset);
@@ -613,41 +612,24 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
613612
RETURN_VALIDATION_FAILED
614613
}
615614

616-
/* Use parse_url - if it returns false, we return NULL */
617-
uri_internal_t *internal_uri = php_uri_parse(uri_handler, Z_STR_P(value), NULL);
618-
if (internal_uri == NULL) {
615+
/* Parse the URI - if it fails, we return NULL */
616+
php_uri *uri = php_uri_parse_to_struct(uri_handler, Z_STR_P(value), URI_COMPONENT_READ_NORMALIZED_MACHINE_FRIENDLY, NULL);
617+
if (uri == NULL) {
619618
RETURN_VALIDATION_FAILED
620619
}
621620

622-
zval scheme;
623-
result = php_uri_get_scheme(internal_uri, URI_COMPONENT_READ_RAW, &scheme);
624-
if (result == FAILURE) {
625-
php_uri_free(internal_uri);
626-
RETURN_VALIDATION_FAILED
627-
}
628-
629-
zval host;
630-
result = php_uri_get_host(internal_uri, URI_COMPONENT_READ_RAW, &host);
631-
if (result == FAILURE) {
632-
zval_ptr_dtor(&scheme);
633-
php_uri_free(internal_uri);
634-
RETURN_VALIDATION_FAILED
635-
}
636-
637-
if (Z_TYPE(scheme) == IS_STRING &&
638-
(zend_string_equals_literal_ci(Z_STR(scheme), "http") || zend_string_equals_literal_ci(Z_STR(scheme), "https"))) {
621+
if (uri->scheme != NULL &&
622+
(zend_string_equals_literal_ci(uri->scheme, "http") || zend_string_equals_literal_ci(uri->scheme, "https"))) {
639623
const char *s;
640624
size_t l;
641625

642-
if (Z_TYPE(host) != IS_STRING) {
643-
php_uri_free(internal_uri);
644-
zval_ptr_dtor(&scheme);
645-
zval_ptr_dtor(&host);
626+
if (uri->host == NULL) {
627+
php_uri_struct_free(uri);
646628
RETURN_VALIDATION_FAILED
647629
}
648630

649-
s = Z_STRVAL(host);
650-
l = Z_STRLEN(host);
631+
s = ZSTR_VAL(uri->host);
632+
l = ZSTR_LEN(uri->host);
651633

652634
if (
653635
/* @todo Find a better solution than hardcoding the uri handler name. Skipping these checks is needed because
@@ -659,80 +641,33 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */
659641
!php_filter_is_valid_ipv6_hostname(url->host) &&
660642
/* Validate domain.
661643
* This includes a loose check for an IPv4 address. */
662-
!_php_filter_validate_domain(Z_STRVAL(host), l, FILTER_FLAG_HOSTNAME)
644+
!_php_filter_validate_domain(ZSTR_VAL(uri->host), l, FILTER_FLAG_HOSTNAME)
663645
) {
664-
php_uri_free(internal_uri);
665-
zval_ptr_dtor(&scheme);
666-
zval_ptr_dtor(&host);
646+
php_uri_struct_free(uri);
667647
RETURN_VALIDATION_FAILED
668648
}
669649
}
670650

671-
zval path;
672-
result = php_uri_get_path(internal_uri, URI_COMPONENT_READ_RAW, &path);
673-
if (result == FAILURE) {
674-
php_uri_free(internal_uri);
675-
zval_ptr_dtor(&scheme);
676-
zval_ptr_dtor(&host);
677-
RETURN_VALIDATION_FAILED
678-
}
679-
680-
zval query;
681-
result = php_uri_get_query(internal_uri, URI_COMPONENT_READ_RAW, &query);
682-
if (result == FAILURE) {
683-
php_uri_free(internal_uri);
684-
zval_ptr_dtor(&scheme);
685-
zval_ptr_dtor(&host);
686-
zval_ptr_dtor(&path);
687-
RETURN_VALIDATION_FAILED
688-
}
689-
690-
if (
691-
Z_TYPE(scheme) == IS_NULL ||
651+
if (uri->scheme == NULL ||
692652
/* some schemes allow the host to be empty */
693-
(Z_TYPE(host) == IS_NULL && (!zend_string_equals_literal(Z_STR(scheme), "mailto") && !zend_string_equals_literal(Z_STR(scheme), "news") && !zend_string_equals_literal(Z_STR(scheme), "file"))) ||
694-
((flags & FILTER_FLAG_PATH_REQUIRED) && Z_TYPE(path) == IS_NULL) || ((flags & FILTER_FLAG_QUERY_REQUIRED) && Z_TYPE(query) == IS_NULL)
653+
(uri->host == NULL && (!zend_string_equals_literal(uri->scheme, "mailto") && !zend_string_equals_literal(uri->scheme, "news") && !zend_string_equals_literal(uri->scheme, "file"))) ||
654+
((flags & FILTER_FLAG_PATH_REQUIRED) && uri->path == NULL) || ((flags & FILTER_FLAG_QUERY_REQUIRED) && uri->query == NULL)
695655
) {
696-
php_uri_free(internal_uri);
697-
zval_ptr_dtor(&scheme);
698-
zval_ptr_dtor(&host);
699-
zval_ptr_dtor(&path);
700-
zval_ptr_dtor(&query);
701-
RETURN_VALIDATION_FAILED
702-
}
703-
704-
zval_ptr_dtor(&scheme);
705-
zval_ptr_dtor(&host);
706-
zval_ptr_dtor(&path);
707-
zval_ptr_dtor(&query);
708-
709-
zval user;
710-
result = php_uri_get_user(internal_uri, URI_COMPONENT_READ_RAW, &user);
711-
if (result == FAILURE) {
712-
php_uri_free(internal_uri);
713-
RETURN_VALIDATION_FAILED
714-
}
715-
716-
zval password;
717-
result = php_uri_get_password(internal_uri, URI_COMPONENT_READ_RAW, &password);
718-
if (result == FAILURE) {
719-
php_uri_free(internal_uri);
720-
zval_ptr_dtor(&user);
656+
php_uri_struct_free(uri);
721657
RETURN_VALIDATION_FAILED
722658
}
723659

724-
if ((Z_TYPE(user) != IS_NULL && !is_userinfo_valid(Z_STR(user)))
725-
|| (Z_TYPE(password) != IS_NULL && !is_userinfo_valid(Z_STR(password)))
660+
if (strcmp(uri_handler->name, "parse_url") == 0 &&
661+
(
662+
(uri->user != NULL && !is_userinfo_valid(uri->user)) ||
663+
(uri->password != NULL && !is_userinfo_valid(uri->password))
664+
)
726665
) {
727-
php_uri_free(internal_uri);
728-
zval_ptr_dtor(&user);
729-
zval_ptr_dtor(&password);
666+
php_uri_struct_free(uri);
730667
RETURN_VALIDATION_FAILED
731668
}
732669

733-
php_uri_free(internal_uri);
734-
zval_ptr_dtor(&user);
735-
zval_ptr_dtor(&password);
670+
php_uri_struct_free(uri);
736671
}
737672
/* }}} */
738673

ext/soap/php_http.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ int make_http_soap_request(zval *this_ptr,
439439
zend_argument_value_error(6, "must be a valid URI parser name");
440440
return FALSE;
441441
}
442-
uri = php_uri_parse_to_struct(uri_handler, location, NULL);
442+
uri = php_uri_parse_to_struct(uri_handler, location, URI_COMPONENT_READ_NORMALIZED_MACHINE_FRIENDLY, NULL);
443443
}
444444

445445
tmp = Z_CLIENT_STREAM_CONTEXT_P(this_ptr);
@@ -1160,7 +1160,7 @@ int make_http_soap_request(zval *this_ptr,
11601160
}
11611161

11621162
zend_string *loc_str = zend_string_init(loc, strlen(loc), false);
1163-
php_uri *new_uri = php_uri_parse_to_struct(uri_handler, loc_str, NULL);
1163+
php_uri *new_uri = php_uri_parse_to_struct(uri_handler, loc_str, URI_COMPONENT_READ_NORMALIZED_MACHINE_FRIENDLY, NULL);
11641164
zend_string_release(loc_str);
11651165

11661166
if (new_uri != NULL) {

ext/uri/php_lexbor.c

+33
Original file line numberDiff line numberDiff line change
@@ -114,93 +114,123 @@ static void fill_errors(zval *errors)
114114
zend_update_property_string(whatwg_error_ce, Z_OBJ(error), "context", sizeof("context") - 1, (const char *) lxb_error->data);
115115

116116
zend_string *error_str;
117+
zval failure;
117118
switch (lxb_error->id) {
118119
case LXB_URL_ERROR_TYPE_DOMAIN_TO_ASCII:
119120
error_str = zend_string_init("DomainToAscii", sizeof("DomainToAscii"), false);
121+
ZVAL_TRUE(&failure);
120122
break;
121123
case LXB_URL_ERROR_TYPE_DOMAIN_TO_UNICODE:
122124
error_str = zend_string_init("DomainToUnicode", sizeof("DomainToUnicode"), false);
125+
ZVAL_FALSE(&failure);
123126
break;
124127
case LXB_URL_ERROR_TYPE_DOMAIN_INVALID_CODE_POINT:
125128
error_str = zend_string_init("DomainInvalidCodePoint", sizeof("DomainInvalidCodePoint"), false);
129+
ZVAL_TRUE(&failure);
126130
break;
127131
case LXB_URL_ERROR_TYPE_HOST_INVALID_CODE_POINT:
128132
error_str = zend_string_init("HostInvalidCodePoint", sizeof("HostInvalidCodePoint"), false);
133+
ZVAL_TRUE(&failure);
129134
break;
130135
case LXB_URL_ERROR_TYPE_IPV4_EMPTY_PART:
131136
error_str = zend_string_init("Ipv4EmptyPart", sizeof("Ipv4EmptyPart"), false);
137+
ZVAL_FALSE(&failure);
132138
break;
133139
case LXB_URL_ERROR_TYPE_IPV4_TOO_MANY_PARTS:
134140
error_str = zend_string_init("Ipv4TooManyParts", sizeof("Ipv4TooManyParts"), false);
141+
ZVAL_TRUE(&failure);
135142
break;
136143
case LXB_URL_ERROR_TYPE_IPV4_NON_NUMERIC_PART:
137144
error_str = zend_string_init("Ipv4NonNumericPart", sizeof("Ipv4NonNumericPart"), false);
145+
ZVAL_TRUE(&failure);
138146
break;
139147
case LXB_URL_ERROR_TYPE_IPV4_NON_DECIMAL_PART:
140148
error_str = zend_string_init("Ipv4NonDecimalPart", sizeof("Ipv4NonDecimalPart"), false);
149+
ZVAL_FALSE(&failure);
141150
break;
142151
case LXB_URL_ERROR_TYPE_IPV4_OUT_OF_RANGE_PART:
143152
error_str = zend_string_init("Ipv4OutOfRangePart", sizeof("Ipv4OutOfRangePart"), false);
153+
ZVAL_TRUE(&failure);
144154
break;
145155
case LXB_URL_ERROR_TYPE_IPV6_UNCLOSED:
146156
error_str = zend_string_init("Ipv6Unclosed", sizeof("Ipv6Unclosed"), false);
157+
ZVAL_TRUE(&failure);
147158
break;
148159
case LXB_URL_ERROR_TYPE_IPV6_INVALID_COMPRESSION:
149160
error_str = zend_string_init("Ipv6InvalidCompression", sizeof("Ipv6InvalidCompression"), false);
161+
ZVAL_TRUE(&failure);
150162
break;
151163
case LXB_URL_ERROR_TYPE_IPV6_TOO_MANY_PIECES:
152164
error_str = zend_string_init("Ipv6TooManyPieces", sizeof("Ipv6TooManyPieces"), false);
165+
ZVAL_TRUE(&failure);
153166
break;
154167
case LXB_URL_ERROR_TYPE_IPV6_MULTIPLE_COMPRESSION:
155168
error_str = zend_string_init("Ipv6MultipleCompression", sizeof("Ipv6MultipleCompression"), false);
169+
ZVAL_TRUE(&failure);
156170
break;
157171
case LXB_URL_ERROR_TYPE_IPV6_INVALID_CODE_POINT:
158172
error_str = zend_string_init("Ipv6InvalidCodePoint", sizeof("Ipv6InvalidCodePoint"), false);
173+
ZVAL_TRUE(&failure);
159174
break;
160175
case LXB_URL_ERROR_TYPE_IPV6_TOO_FEW_PIECES:
161176
error_str = zend_string_init("Ipv6TooFewPieces", sizeof("Ipv6TooFewPieces"), false);
177+
ZVAL_TRUE(&failure);
162178
break;
163179
case LXB_URL_ERROR_TYPE_IPV4_IN_IPV6_TOO_MANY_PIECES:
164180
error_str = zend_string_init("Ipv4InIpv6TooManyPieces", sizeof("Ipv4InIpv6TooManyPieces"), false);
181+
ZVAL_TRUE(&failure);
165182
break;
166183
case LXB_URL_ERROR_TYPE_IPV4_IN_IPV6_INVALID_CODE_POINT:
167184
error_str = zend_string_init("Ipv4InIpv6InvalidCodePoint", sizeof("Ipv4InIpv6InvalidCodePoint"), false);
185+
ZVAL_TRUE(&failure);
168186
break;
169187
case LXB_URL_ERROR_TYPE_IPV4_IN_IPV6_OUT_OF_RANGE_PART:
170188
error_str = zend_string_init("Ipv4InIpv6OutOfRangePart", sizeof("Ipv4InIpv6OutOfRangePart"), false);
189+
ZVAL_TRUE(&failure);
171190
break;
172191
case LXB_URL_ERROR_TYPE_IPV4_IN_IPV6_TOO_FEW_PARTS:
173192
error_str = zend_string_init("Ipv4InIpv6TooFewParts", sizeof("Ipv4InIpv6TooFewParts"), false);
193+
ZVAL_TRUE(&failure);
174194
break;
175195
case LXB_URL_ERROR_TYPE_INVALID_URL_UNIT:
176196
error_str = zend_string_init("InvalidUrlUnit", sizeof("InvalidUrlUnit"), false);
197+
ZVAL_FALSE(&failure);
177198
break;
178199
case LXB_URL_ERROR_TYPE_SPECIAL_SCHEME_MISSING_FOLLOWING_SOLIDUS:
179200
error_str = zend_string_init("SpecialSchemeMissingFollowingSolidus", sizeof("SpecialSchemeMissingFollowingSolidus"), false);
201+
ZVAL_FALSE(&failure);
180202
break;
181203
case LXB_URL_ERROR_TYPE_MISSING_SCHEME_NON_RELATIVE_URL:
182204
error_str = zend_string_init("MissingSchemeNonRelativeUrl", sizeof("MissingSchemeNonRelativeUrl"), false);
205+
ZVAL_TRUE(&failure);
183206
break;
184207
case LXB_URL_ERROR_TYPE_INVALID_REVERSE_SOLIDUS:
185208
error_str = zend_string_init("InvalidReverseSoldius", sizeof("InvalidReverseSoldius"), false);
209+
ZVAL_FALSE(&failure);
186210
break;
187211
case LXB_URL_ERROR_TYPE_INVALID_CREDENTIALS:
188212
error_str = zend_string_init("InvalidCredentials", sizeof("InvalidCredentials"), false);
213+
ZVAL_FALSE(&failure);
189214
break;
190215
case LXB_URL_ERROR_TYPE_HOST_MISSING:
191216
error_str = zend_string_init("HostMissing", sizeof("HostMissing"), false);
217+
ZVAL_TRUE(&failure);
192218
break;
193219
case LXB_URL_ERROR_TYPE_PORT_OUT_OF_RANGE:
194220
error_str = zend_string_init("PortOfOfRange", sizeof("PortOfOfRange"), false);
221+
ZVAL_TRUE(&failure);
195222
break;
196223
case LXB_URL_ERROR_TYPE_PORT_INVALID:
197224
error_str = zend_string_init("PortInvalid", sizeof("PortInvalid"), false);
225+
ZVAL_TRUE(&failure);
198226
break;
199227
case LXB_URL_ERROR_TYPE_FILE_INVALID_WINDOWS_DRIVE_LETTER:
200228
error_str = zend_string_init("FileInvalidWindowsDriveLetter", sizeof("FileInvalidWindowsDriveLetter"), false);
229+
ZVAL_FALSE(&failure);
201230
break;
202231
case LXB_URL_ERROR_TYPE_FILE_INVALID_WINDOWS_DRIVE_LETTER_HOST:
203232
error_str = zend_string_init("FileInvalidWindowsDriveLetterHost", sizeof("FileInvalidWindowsDriveLetterHost"), false);
233+
ZVAL_FALSE(&failure);
204234
break;
205235
EMPTY_SWITCH_DEFAULT_CASE()
206236
}
@@ -211,6 +241,9 @@ static void fill_errors(zval *errors)
211241
zend_string_release(error_str);
212242
zval_ptr_dtor(&error_type);
213243

244+
zend_update_property(whatwg_error_ce, Z_OBJ(error), "failure", sizeof("failure") - 1, &failure);
245+
zval_ptr_dtor(&failure);
246+
214247
add_next_index_zval(errors, &error);
215248
}
216249

0 commit comments

Comments
 (0)