From f6c3e46648354a01ef14390669d4231261464bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 25 Aug 2025 20:34:14 +0200 Subject: [PATCH 1/3] uri: Unify string creation in `php_uri_parser_rfc3986_scheme_read()` --- ext/uri/uri_parser_rfc3986.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index fd21308bedee7..1272240b73fc7 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -100,8 +100,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(con ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->scheme.first != NULL && uriparser_uri->scheme.afterLast != NULL) { - zend_string *str = zend_string_init(uriparser_uri->scheme.first, get_text_range_length(&uriparser_uri->scheme), false); - ZVAL_NEW_STR(retval, str); + ZVAL_STRINGL(retval, uriparser_uri->scheme.first, get_text_range_length(&uriparser_uri->scheme)); } else { ZVAL_NULL(retval); } From f734e8a772aa03dc134a97ff3c4ae5017972f895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 25 Aug 2025 20:36:21 +0200 Subject: [PATCH 2/3] uri: Remove useless non-NULL assertions in uri_parser_rfc3986.c The value of `uriparser_uri` is dereferenced *immediately* after the assertion, making it redundant for both the human reader and the compiler. In case of the normalized_uri, the pointer is trivially non-NULL, since it is referring to a struct member at not-the-first position. Generally speaking, unless something is checked for `NULL` one can assume it to never be `NULL`. --- ext/uri/uri_parser_rfc3986.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index 1272240b73fc7..c1ebe7e852de9 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -97,7 +97,6 @@ ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_reading(php_uri_parser_rfc398 ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->scheme.first != NULL && uriparser_uri->scheme.afterLast != NULL) { ZVAL_STRINGL(retval, uriparser_uri->scheme.first, get_text_range_length(&uriparser_uri->scheme)); @@ -111,7 +110,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(con ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { ZVAL_STRINGL(retval, uriparser_uri->userInfo.first, get_text_range_length(&uriparser_uri->userInfo)); @@ -125,7 +123,6 @@ ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const ur ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { size_t length = get_text_range_length(&uriparser_uri->userInfo); @@ -148,7 +145,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(c ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { const char *c = memchr(uriparser_uri->userInfo.first, ':', get_text_range_length(&uriparser_uri->userInfo)); @@ -168,7 +164,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(c ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->hostText.first != NULL && uriparser_uri->hostText.afterLast != NULL) { if (uriparser_uri->hostData.ip6 != NULL || uriparser_uri->hostData.ipFuture.first != NULL) { @@ -204,7 +199,6 @@ ZEND_ATTRIBUTE_NONNULL static size_t str_to_int(const char *str, size_t len) ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->portText.first != NULL && uriparser_uri->portText.afterLast != NULL) { ZVAL_LONG(retval, str_to_int(uriparser_uri->portText.first, get_text_range_length(&uriparser_uri->portText))); @@ -218,7 +212,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(const ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->pathHead != NULL) { smart_str str = {0}; @@ -247,7 +240,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(const ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->query.first != NULL && uriparser_uri->query.afterLast != NULL) { ZVAL_STRINGL(retval, uriparser_uri->query.first, get_text_range_length(&uriparser_uri->query)); @@ -261,7 +253,6 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(cons ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval) { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - ZEND_ASSERT(uriparser_uri != NULL); if (uriparser_uri->fragment.first != NULL && uriparser_uri->fragment.afterLast != NULL) { ZVAL_STRINGL(retval, uriparser_uri->fragment.first, get_text_range_length(&uriparser_uri->fragment)); From 5932440bf101be4f7a9d1956af62316822e8e9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 25 Aug 2025 22:03:29 +0200 Subject: [PATCH 3/3] uri: Add `has_text_range()` helper to uri_parser_rfc3986.c --- ext/uri/uri_parser_rfc3986.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index c1ebe7e852de9..c80952a80c388 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -64,6 +64,11 @@ static inline size_t get_text_range_length(const UriTextRangeA *range) return range->afterLast - range->first; } +static inline bool has_text_range(const UriTextRangeA *range) +{ + return range->first != NULL && range->afterLast != NULL; +} + ZEND_ATTRIBUTE_NONNULL static void copy_uri(UriUriA *new_uriparser_uri, const UriUriA *uriparser_uri) { int result = uriCopyUriMmA(new_uriparser_uri, uriparser_uri, mm); @@ -111,7 +116,7 @@ ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const ur { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { + if (has_text_range(&uriparser_uri->userInfo)) { ZVAL_STRINGL(retval, uriparser_uri->userInfo.first, get_text_range_length(&uriparser_uri->userInfo)); } else { ZVAL_NULL(retval); @@ -124,7 +129,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(c { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { + if (has_text_range(&uriparser_uri->userInfo)) { size_t length = get_text_range_length(&uriparser_uri->userInfo); const char *c = memchr(uriparser_uri->userInfo.first, ':', length); @@ -146,7 +151,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(c { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->userInfo.first != NULL && uriparser_uri->userInfo.afterLast != NULL) { + if (has_text_range(&uriparser_uri->userInfo)) { const char *c = memchr(uriparser_uri->userInfo.first, ':', get_text_range_length(&uriparser_uri->userInfo)); if (c != NULL && uriparser_uri->userInfo.afterLast - c - 1 > 0) { @@ -165,7 +170,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(const { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->hostText.first != NULL && uriparser_uri->hostText.afterLast != NULL) { + if (has_text_range(&uriparser_uri->hostText)) { if (uriparser_uri->hostData.ip6 != NULL || uriparser_uri->hostData.ipFuture.first != NULL) { /* the textual representation of the host is always accessible in the .hostText field no matter what the host is */ smart_str host_str = {0}; @@ -200,7 +205,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(const { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->portText.first != NULL && uriparser_uri->portText.afterLast != NULL) { + if (has_text_range(&uriparser_uri->portText)) { ZVAL_LONG(retval, str_to_int(uriparser_uri->portText.first, get_text_range_length(&uriparser_uri->portText))); } else { ZVAL_NULL(retval); @@ -241,7 +246,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(cons { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->query.first != NULL && uriparser_uri->query.afterLast != NULL) { + if (has_text_range(&uriparser_uri->query)) { ZVAL_STRINGL(retval, uriparser_uri->query.first, get_text_range_length(&uriparser_uri->query)); } else { ZVAL_NULL(retval); @@ -254,7 +259,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(c { const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); - if (uriparser_uri->fragment.first != NULL && uriparser_uri->fragment.afterLast != NULL) { + if (has_text_range(&uriparser_uri->fragment)) { ZVAL_STRINGL(retval, uriparser_uri->fragment.first, get_text_range_length(&uriparser_uri->fragment)); } else { ZVAL_NULL(retval);