@@ -42,13 +42,14 @@ static void uriparser_normalize_uri(UriUriA *uriparser_uri)
4242 ZEND_ASSERT (result == URI_SUCCESS );
4343}
4444
45- static void normalize_uri_if_needed (uriparser_uris_t * uriparser_uris )
46- {
47- if (uriparser_uris -> normalized_uri_initialized == false) {
45+ static UriUriA * get_normalized_uri (uriparser_uris_t * uriparser_uris ) {
46+ if (!uriparser_uris -> normalized_uri_initialized ) {
4847 uriparser_copy_uri (& uriparser_uris -> normalized_uri , & uriparser_uris -> uri );
4948 uriparser_normalize_uri (& uriparser_uris -> normalized_uri );
5049 uriparser_uris -> normalized_uri_initialized = true;
5150 }
51+
52+ return & uriparser_uris -> normalized_uri ;
5253}
5354
5455static UriUriA * uriparser_read_uri (uriparser_uris_t * uriparser_uris , uri_component_read_mode_t read_mode )
@@ -59,9 +60,7 @@ static UriUriA *uriparser_read_uri(uriparser_uris_t *uriparser_uris, uri_compone
5960 case URI_COMPONENT_READ_NORMALIZED_ASCII :
6061 ZEND_FALLTHROUGH ;
6162 case URI_COMPONENT_READ_NORMALIZED_UNICODE :
62- normalize_uri_if_needed (uriparser_uris );
63-
64- return & uriparser_uris -> normalized_uri ;
63+ return get_normalized_uri (uriparser_uris );
6564 EMPTY_SWITCH_DEFAULT_CASE ()
6665 }
6766}
@@ -102,7 +101,7 @@ static zend_result uriparser_read_username(const uri_internal_t *internal_uri, u
102101
103102 if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
104103 size_t length = get_text_range_length (& uriparser_uri -> userInfo );
105- char * c = memchr (uriparser_uri -> userInfo .first , ':' , length );
104+ const char * c = memchr (uriparser_uri -> userInfo .first , ':' , length );
106105
107106 if (c == NULL && length > 0 ) {
108107 ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , length );
@@ -145,6 +144,7 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
145144
146145 if (uriparser_uri -> hostText .first != NULL && uriparser_uri -> hostText .afterLast != NULL && get_text_range_length (& uriparser_uri -> hostText ) > 0 ) {
147146 if (uriparser_uri -> hostData .ip6 != NULL || uriparser_uri -> hostData .ipFuture .first != NULL ) {
147+ /* the textual representation of the host is always accessible in the .hostText field no matter what the host is */
148148 smart_str host_str = {0 };
149149
150150 smart_str_appendc (& host_str , '[' );
@@ -162,7 +162,7 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
162162 return SUCCESS ;
163163}
164164
165- static int str_to_int (const char * str , int len )
165+ static size_t str_to_int (const char * str , size_t len )
166166{
167167 int result = 0 ;
168168
@@ -287,7 +287,7 @@ PHP_MINIT_FUNCTION(uri_uriparser)
287287
288288static uriparser_uris_t * uriparser_create_uris (void )
289289{
290- uriparser_uris_t * uriparser_uris = emalloc ( sizeof (* uriparser_uris ));
290+ uriparser_uris_t * uriparser_uris = ecalloc ( 1 , sizeof (* uriparser_uris ));
291291 uriparser_uris -> normalized_uri_initialized = false;
292292
293293 return uriparser_uris ;
@@ -325,6 +325,7 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
325325
326326 if (uriAddBaseUriA (& uriparser_uris -> uri , & uri , & uriparser_base_urls -> uri ) != URI_SUCCESS ) {
327327 efree (uriparser_uris );
328+ uriFreeUriMembersA (& uri );
328329 if (!silent ) {
329330 throw_invalid_uri_exception ();
330331 }
@@ -350,7 +351,7 @@ void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval
350351 * is discarded altogether. */
351352static void * uriparser_clone_uri (void * uri )
352353{
353- uriparser_uris_t * uriparser_uris = ( uriparser_uris_t * ) uri ;
354+ uriparser_uris_t * uriparser_uris = uri ;
354355
355356 uriparser_uris_t * new_uriparser_uris = uriparser_create_uris ();
356357 uriparser_copy_uri (& new_uriparser_uris -> uri , & uriparser_uris -> uri );
@@ -364,15 +365,13 @@ static void *uriparser_clone_uri(void *uri)
364365
365366static zend_string * uriparser_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment )
366367{
367- uriparser_uris_t * uriparser_uris = ( uriparser_uris_t * ) uri ;
368+ uriparser_uris_t * uriparser_uris = uri ;
368369 UriUriA * uriparser_uri ;
369370
370371 if (recomposition_mode == URI_RECOMPOSITION_RAW_ASCII || recomposition_mode == URI_RECOMPOSITION_RAW_UNICODE ) {
371372 uriparser_uri = & uriparser_uris -> uri ;
372373 } else {
373- normalize_uri_if_needed (uriparser_uris );
374-
375- uriparser_uri = & uriparser_uris -> normalized_uri ;
374+ uriparser_uri = get_normalized_uri (uriparser_uris );
376375 }
377376
378377 int charsRequired = 0 ;
@@ -397,15 +396,10 @@ static zend_string *uriparser_uri_to_string(void *uri, uri_recomposition_mode_t
397396
398397static void uriparser_free_uri (void * uri )
399398{
400- uriparser_uris_t * uriparser_uris = ( uriparser_uris_t * ) uri ;
399+ uriparser_uris_t * uriparser_uris = uri ;
401400
402401 uriFreeUriMembersA (& uriparser_uris -> uri );
403-
404- if (uriparser_uris -> normalized_uri_initialized ) {
405- ZEND_ASSERT (uriparser_uris -> normalized_uri .owner );
406-
407- uriFreeUriMembersA (& uriparser_uris -> normalized_uri );
408- }
402+ uriFreeUriMembersA (& uriparser_uris -> normalized_uri );
409403
410404 efree (uriparser_uris );
411405}
0 commit comments