From 3ac9efe41536dc41a02e7eee9465051c599327a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 20 Oct 2025 10:30:20 +0200 Subject: [PATCH] uri: Make uri_parser_rfc3986.h usable for external extensions (#20173) This header could not previously be used due to the `uriparser/Uri.h` include, which is required for the struct definition. Since this struct is considered an implementation detail, we can just make it opaque, preserving type safety, but without allowing external users to touch its contents. Fixes php/php-src#19868. --- NEWS | 2 ++ ext/uri/uri_parser_rfc3986.c | 8 ++++++++ ext/uri/uri_parser_rfc3986.h | 7 +------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 08daf17d219..908838a60db 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,8 @@ PHP NEWS - URI: . Fixed bug GH-20088 (Heap-use-after-free in PHP URI WHATWG parser during malformed URL processing). (lexborisov) + . Fixed bug GH-19868 (Unable to use uri_parser_rfc3986.h from external + extensions). (timwolla) 09 Oct 2025, PHP 8.5.0RC2 diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index 24dd4e1947b..628b73b123f 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -20,6 +20,14 @@ #include "Zend/zend_smart_str.h" #include "Zend/zend_exceptions.h" +#include + +struct php_uri_parser_rfc3986_uris { + UriUriA uri; + UriUriA normalized_uri; + bool normalized_uri_initialized; +}; + static void *php_uri_parser_rfc3986_memory_manager_malloc(UriMemoryManager *memory_manager, size_t size) { return emalloc(size); diff --git a/ext/uri/uri_parser_rfc3986.h b/ext/uri/uri_parser_rfc3986.h index bdf792816c2..b6d42441db7 100644 --- a/ext/uri/uri_parser_rfc3986.h +++ b/ext/uri/uri_parser_rfc3986.h @@ -17,16 +17,11 @@ #ifndef PHP_URI_PARSER_RFC3986_H #define PHP_URI_PARSER_RFC3986_H -#include #include "php_uri_common.h" extern const php_uri_parser php_uri_parser_rfc3986; -typedef struct php_uri_parser_rfc3986_uris { - UriUriA uri; - UriUriA normalized_uri; - bool normalized_uri_initialized; -} php_uri_parser_rfc3986_uris; +typedef struct php_uri_parser_rfc3986_uris php_uri_parser_rfc3986_uris; zend_result php_uri_parser_rfc3986_userinfo_read(void *uri, php_uri_component_read_mode read_mode, zval *retval); zend_result php_uri_parser_rfc3986_userinfo_write(void *uri, zval *value, zval *errors);