2323static void uriparser_free_uri (void * uri );
2424static void throw_invalid_uri_exception (void );
2525
26+ static void * uriparser_malloc (UriMemoryManager * memory_manager , size_t size )
27+ {
28+ return emalloc (size );
29+ }
30+
31+ static void * uriparser_calloc (UriMemoryManager * memory_manager , size_t nmemb , size_t size )
32+ {
33+ return ecalloc (nmemb , size );
34+ }
35+
36+ static void * uriparser_realloc (UriMemoryManager * memory_manager , void * ptr , size_t size )
37+ {
38+ return erealloc (ptr , size );
39+ }
40+
41+ static void * uriparser_reallocarray (UriMemoryManager * memory_manager , void * ptr , size_t nmemb , size_t size )
42+ {
43+ return safe_erealloc (ptr , nmemb , size , 0 );
44+ }
45+
46+ static void uriparser_free (UriMemoryManager * memory_manager , void * ptr )
47+ {
48+ efree (ptr );
49+ }
50+
51+ static const UriMemoryManager uriparser_mm = {
52+ .malloc = uriparser_malloc ,
53+ .calloc = uriparser_calloc ,
54+ .realloc = uriparser_realloc ,
55+ .reallocarray = uriparser_reallocarray ,
56+ .free = uriparser_free ,
57+ .userData = NULL ,
58+ };
59+
60+ /* The library expects a pointer to a non-const UriMemoryManager, but does
61+ * not actually modify it (and neither does our implementation). Use a
62+ * const struct with a non-const pointer for convenience. */
63+ static UriMemoryManager * const mm = (UriMemoryManager * )& uriparser_mm ;
64+
2665static inline size_t get_text_range_length (const UriTextRangeA * range )
2766{
2867 return range -> afterLast - range -> first ;
2968}
3069
3170ZEND_ATTRIBUTE_NONNULL static void uriparser_copy_uri (UriUriA * new_uriparser_uri , const UriUriA * uriparser_uri )
3271{
33- int result = uriCopyUriA (new_uriparser_uri , uriparser_uri );
72+ int result = uriCopyUriMmA (new_uriparser_uri , uriparser_uri , mm );
3473 ZEND_ASSERT (result == URI_SUCCESS );
3574}
3675
3776ZEND_ATTRIBUTE_NONNULL static UriUriA * get_normalized_uri (uriparser_uris_t * uriparser_uris ) {
3877 if (!uriparser_uris -> normalized_uri_initialized ) {
3978 uriparser_copy_uri (& uriparser_uris -> normalized_uri , & uriparser_uris -> uri );
40- int result = uriNormalizeSyntaxExA (& uriparser_uris -> normalized_uri , (unsigned int )-1 );
79+ int result = uriNormalizeSyntaxExMmA (& uriparser_uris -> normalized_uri , (unsigned int )-1 , mm );
4180 ZEND_ASSERT (result == URI_SUCCESS );
4281 uriparser_uris -> normalized_uri_initialized = true;
4382 }
@@ -237,43 +276,12 @@ ZEND_ATTRIBUTE_NONNULL static zend_result uriparser_read_fragment(const uri_inte
237276 return SUCCESS ;
238277}
239278
240- static void * uriparser_malloc (UriMemoryManager * memory_manager , size_t size )
241- {
242- return emalloc (size );
243- }
244-
245- static void * uriparser_calloc (UriMemoryManager * memory_manager , size_t nmemb , size_t size )
246- {
247- return ecalloc (nmemb , size );
248- }
249-
250- static void * uriparser_realloc (UriMemoryManager * memory_manager , void * ptr , size_t size )
251- {
252- return erealloc (ptr , size );
253- }
254-
255- static void * uriparser_reallocarray (UriMemoryManager * memory_manager , void * ptr , size_t nmemb , size_t size )
256- {
257- return safe_erealloc (ptr , nmemb , size , 0 );
258- }
259-
260- static void uriparser_free (UriMemoryManager * memory_manager , void * ptr )
261- {
262- efree (ptr );
263- }
264-
265279PHP_MINIT_FUNCTION (uri_uriparser )
266280{
267281 if (uri_handler_register (& uriparser_uri_handler ) == FAILURE ) {
268282 return FAILURE ;
269283 }
270284
271- defaultMemoryManager .malloc = uriparser_malloc ;
272- defaultMemoryManager .calloc = uriparser_calloc ;
273- defaultMemoryManager .realloc = uriparser_realloc ;
274- defaultMemoryManager .reallocarray = uriparser_reallocarray ;
275- defaultMemoryManager .free = uriparser_free ;
276-
277285 return SUCCESS ;
278286}
279287
@@ -293,7 +301,7 @@ static void throw_invalid_uri_exception(void)
293301#define PARSE_URI (dest_uri , uri_str , uriparser_uris , silent ) \
294302 do { \
295303 if (ZSTR_LEN(uri_str) == 0 || \
296- uriParseSingleUriExA (dest_uri, ZSTR_VAL(uri_str), ZSTR_VAL(uri_str) + ZSTR_LEN(uri_str), NULL) != URI_SUCCESS \
304+ uriParseSingleUriExMmA (dest_uri, ZSTR_VAL(uri_str), ZSTR_VAL(uri_str) + ZSTR_LEN(uri_str), NULL, mm ) != URI_SUCCESS \
297305 ) { \
298306 efree(uriparser_uris); \
299307 if (!silent) { \
@@ -309,24 +317,24 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
309317
310318 if (uriparser_base_urls == NULL ) {
311319 PARSE_URI (& uriparser_uris -> uri , uri_str , uriparser_uris , silent );
312- uriMakeOwnerA (& uriparser_uris -> uri );
320+ uriMakeOwnerMmA (& uriparser_uris -> uri , mm );
313321 } else {
314322 UriUriA uri ;
315323
316324 PARSE_URI (& uri , uri_str , uriparser_uris , silent );
317325
318- if (uriAddBaseUriA (& uriparser_uris -> uri , & uri , & uriparser_base_urls -> uri ) != URI_SUCCESS ) {
326+ if (uriAddBaseUriExMmA (& uriparser_uris -> uri , & uri , & uriparser_base_urls -> uri , URI_RESOLVE_STRICTLY , mm ) != URI_SUCCESS ) {
319327 efree (uriparser_uris );
320- uriFreeUriMembersA (& uri );
328+ uriFreeUriMembersMmA (& uri , mm );
321329 if (!silent ) {
322330 throw_invalid_uri_exception ();
323331 }
324332
325333 return NULL ;
326334 }
327335
328- uriMakeOwnerA (& uriparser_uris -> uri );
329- uriFreeUriMembersA (& uri );
336+ uriMakeOwnerMmA (& uriparser_uris -> uri , mm );
337+ uriFreeUriMembersMmA (& uri , mm );
330338 }
331339
332340 return uriparser_uris ;
@@ -390,8 +398,8 @@ ZEND_ATTRIBUTE_NONNULL static void uriparser_free_uri(void *uri)
390398{
391399 uriparser_uris_t * uriparser_uris = uri ;
392400
393- uriFreeUriMembersA (& uriparser_uris -> uri );
394- uriFreeUriMembersA (& uriparser_uris -> normalized_uri );
401+ uriFreeUriMembersMmA (& uriparser_uris -> uri , mm );
402+ uriFreeUriMembersMmA (& uriparser_uris -> normalized_uri , mm );
395403
396404 efree (uriparser_uris );
397405}
0 commit comments