Skip to content

Commit c1ed608

Browse files
authored
uri: Do not overwrite defaultMemoryManager (#19042)
The `defaultMemoryManager` is only available via a non-public header and is not supposed to be used by users of the library [1]. It also has a very generic name, further indicating that it is not supposed to be used. Instead pass the memory manager explicitly, which is how the library is supposed to be used. [1] uriparser/uriparser#52 (comment)
1 parent 22f2a1d commit c1ed608

File tree

2 files changed

+49
-42
lines changed

2 files changed

+49
-42
lines changed

ext/uri/php_uriparser.c

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,60 @@
2323
static void uriparser_free_uri(void *uri);
2424
static 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+
2665
static inline size_t get_text_range_length(const UriTextRangeA *range)
2766
{
2867
return range->afterLast - range->first;
2968
}
3069

3170
ZEND_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

3776
ZEND_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-
265279
PHP_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
}

ext/uri/php_uriparser.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#define PHP_URIPARSER_H
1919

2020
#include <uriparser/Uri.h>
21-
#include "uriparser/src/UriMemory.h"
2221
#include "php_uri_common.h"
2322

2423
extern const uri_handler_t uriparser_uri_handler;

0 commit comments

Comments
 (0)