diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index fd21308bedee7..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); @@ -97,11 +102,9 @@ 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) { - 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); } @@ -112,9 +115,8 @@ 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) { + 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); @@ -126,9 +128,8 @@ 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) { + 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); @@ -149,9 +150,8 @@ 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) { + 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) { @@ -169,9 +169,8 @@ 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 (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}; @@ -205,9 +204,8 @@ 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) { + 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); @@ -219,7 +217,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}; @@ -248,9 +245,8 @@ 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) { + 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); @@ -262,9 +258,8 @@ 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) { + 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);