@@ -24,9 +24,6 @@ void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval
24
24
static void uriparser_free_uri (void * uri );
25
25
static void throw_invalid_uri_exception (void );
26
26
27
- HashTable uriparser_property_handlers ;
28
- UriMemoryManager uriparser_memory_manager ;
29
-
30
27
static void uriparser_copy_text_range (UriTextRangeA * text_range , UriTextRangeA * new_text_range , bool use_safe )
31
28
{
32
29
if (text_range -> first == NULL || text_range -> afterLast == NULL || (text_range -> first > text_range -> afterLast && !use_safe )) {
@@ -99,34 +96,43 @@ static UriUriA *uriparser_copy_uri(UriUriA *uriparser_uri) // TODO add to uripar
99
96
100
97
static zend_result uriparser_normalize_uri (UriUriA * uriparser_uri )
101
98
{
102
- if (uriNormalizeSyntaxExMmA (uriparser_uri , (unsigned int )-1 , & uriparser_memory_manager ) != URI_SUCCESS ) {
99
+ if (uriNormalizeSyntaxExA (uriparser_uri , (unsigned int )-1 ) != URI_SUCCESS ) {
103
100
return FAILURE ;
104
101
}
105
102
106
103
return SUCCESS ;
107
104
}
108
105
109
- #define URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode ) do { \
110
- if (read_mode == URI_COMPONENT_READ_RAW) { \
111
- uriparser_uri = (UriUriA *) uriparser_uris->uri; \
112
- } else if (read_mode == URI_COMPONENT_READ_NORMALIZED_UNICODE || read_mode == URI_COMPONENT_READ_NORMALIZED_ASCII) { \
113
- if (uriparser_uris->normalized_uri == NULL) { \
114
- uriparser_uris->normalized_uri = uriparser_copy_uri(uriparser_uris->uri); \
115
- if (uriparser_normalize_uri(uriparser_uris->normalized_uri) == FAILURE) { \
116
- return FAILURE; \
117
- } \
118
- } \
119
- uriparser_uri = uriparser_uris->normalized_uri; \
120
- } else { \
121
- ZEND_UNREACHABLE(); \
122
- } \
123
- } while (0)
106
+ static UriUriA * uriparser_read_uri (uriparser_uris_t * uriparser_uris , uri_component_read_mode_t read_mode )
107
+ {
108
+ switch (read_mode ) {
109
+ case URI_COMPONENT_READ_RAW :
110
+ return uriparser_uris -> uri ;
111
+ case URI_COMPONENT_READ_NORMALIZED_ASCII :
112
+ ZEND_FALLTHROUGH ;
113
+ case URI_COMPONENT_READ_NORMALIZED_UNICODE :
114
+ if (uriparser_uris -> normalized_uri == NULL ) {
115
+ uriparser_uris -> normalized_uri = uriparser_copy_uri (uriparser_uris -> uri );
116
+ if (uriparser_normalize_uri (uriparser_uris -> normalized_uri ) == FAILURE ) {
117
+ uriFreeUriMembersA (uriparser_uris -> normalized_uri );
118
+ efree (uriparser_uris -> normalized_uri );
119
+ uriparser_uris -> normalized_uri = NULL ;
120
+
121
+ return NULL ;
122
+ }
123
+ }
124
+
125
+ return uriparser_uris -> normalized_uri ;
126
+ EMPTY_SWITCH_DEFAULT_CASE ()
127
+ }
128
+ }
124
129
125
130
static zend_result uriparser_read_scheme (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
126
131
{
127
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
128
- UriUriA * uriparser_uri ;
129
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
132
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
133
+ if (UNEXPECTED (uriparser_uri == NULL )) {
134
+ return FAILURE ;
135
+ }
130
136
131
137
if (uriparser_uri -> scheme .first != NULL && uriparser_uri -> scheme .afterLast != NULL ) {
132
138
zend_string * str = zend_string_init (uriparser_uri -> scheme .first , uriparser_uri -> scheme .afterLast - uriparser_uri -> scheme .first , false);
@@ -140,9 +146,10 @@ static zend_result uriparser_read_scheme(const uri_internal_t *internal_uri, uri
140
146
141
147
zend_result uriparser_read_userinfo (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
142
148
{
143
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
144
- UriUriA * uriparser_uri ;
145
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
149
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
150
+ if (UNEXPECTED (uriparser_uri == NULL )) {
151
+ return FAILURE ;
152
+ }
146
153
147
154
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
148
155
ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , uriparser_uri -> userInfo .afterLast - uriparser_uri -> userInfo .first );
@@ -155,14 +162,17 @@ zend_result uriparser_read_userinfo(const uri_internal_t *internal_uri, uri_comp
155
162
156
163
static zend_result uriparser_read_username (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
157
164
{
158
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
159
- UriUriA * uriparser_uri ;
160
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
165
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
166
+ if (UNEXPECTED (uriparser_uri == NULL )) {
167
+ return FAILURE ;
168
+ }
161
169
162
170
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
163
- char * c = strchr (uriparser_uri -> userInfo .first , ':' );
164
- if (c == NULL && uriparser_uri -> userInfo .afterLast - uriparser_uri -> userInfo .first > 0 ) {
165
- ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , uriparser_uri -> userInfo .afterLast - uriparser_uri -> userInfo .first );
171
+ size_t length = uriparser_uri -> userInfo .afterLast - uriparser_uri -> userInfo .first ;
172
+ char * c = memchr (uriparser_uri -> userInfo .first , ':' , length );
173
+
174
+ if (c == NULL && length > 0 ) {
175
+ ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , length );
166
176
} else if (c != NULL && c - uriparser_uri -> userInfo .first > 0 ) {
167
177
ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , c - uriparser_uri -> userInfo .first );
168
178
} else {
@@ -177,12 +187,14 @@ static zend_result uriparser_read_username(const uri_internal_t *internal_uri, u
177
187
178
188
static zend_result uriparser_read_password (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
179
189
{
180
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
181
- UriUriA * uriparser_uri ;
182
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
190
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
191
+ if (UNEXPECTED (uriparser_uri == NULL )) {
192
+ return FAILURE ;
193
+ }
183
194
184
195
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
185
- char * c = strchr (uriparser_uri -> userInfo .first , ':' );
196
+ const char * c = memchr (uriparser_uri -> userInfo .first , ':' , uriparser_uri -> userInfo .afterLast - uriparser_uri -> userInfo .first );
197
+
186
198
if (c != NULL && uriparser_uri -> userInfo .afterLast - c - 1 > 0 ) {
187
199
ZVAL_STRINGL (retval , c + 1 , uriparser_uri -> userInfo .afterLast - c - 1 );
188
200
} else {
@@ -197,9 +209,10 @@ static zend_result uriparser_read_password(const uri_internal_t *internal_uri, u
197
209
198
210
static zend_result uriparser_read_host (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
199
211
{
200
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
201
- UriUriA * uriparser_uri ;
202
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
212
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
213
+ if (UNEXPECTED (uriparser_uri == NULL )) {
214
+ return FAILURE ;
215
+ }
203
216
204
217
if (uriparser_uri -> hostText .first != NULL && uriparser_uri -> hostText .afterLast != NULL && uriparser_uri -> hostText .afterLast - uriparser_uri -> hostText .first > 0 ) {
205
218
if (uriparser_uri -> hostData .ip6 != NULL ) {
@@ -209,7 +222,7 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
209
222
smart_str_appendl (& host_str , uriparser_uri -> hostText .first , uriparser_uri -> hostText .afterLast - uriparser_uri -> hostText .first );
210
223
smart_str_appendc (& host_str , ']' );
211
224
212
- ZVAL_STR (retval , smart_str_extract (& host_str ));
225
+ ZVAL_NEW_STR (retval , smart_str_extract (& host_str ));
213
226
} else {
214
227
ZVAL_STRINGL (retval , uriparser_uri -> hostText .first , uriparser_uri -> hostText .afterLast - uriparser_uri -> hostText .first );
215
228
}
@@ -236,26 +249,27 @@ static zend_result uriparser_read_port(const uri_internal_t *internal_uri, uri_c
236
249
237
250
static zend_result uriparser_read_path (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
238
251
{
239
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
240
- UriUriA * uriparser_uri ;
241
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
252
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
253
+ if (UNEXPECTED (uriparser_uri == NULL )) {
254
+ return FAILURE ;
255
+ }
242
256
243
257
if (uriparser_uri -> pathHead != NULL ) {
244
258
const UriPathSegmentA * p ;
245
259
smart_str str = {0 };
246
260
247
261
if (uriparser_uri -> absolutePath || uriIsHostSetA (uriparser_uri )) {
248
- smart_str_appends (& str , "/" );
262
+ smart_str_appendc (& str , '/' );
249
263
}
250
264
251
- smart_str_appendl (& str , uriparser_uri -> pathHead -> text .first , (int ) ((uriparser_uri -> pathHead -> text ).afterLast - (uriparser_uri -> pathHead -> text ).first ));
265
+ smart_str_appendl (& str , uriparser_uri -> pathHead -> text .first , (size_t ) ((uriparser_uri -> pathHead -> text ).afterLast - (uriparser_uri -> pathHead -> text ).first ));
252
266
253
267
for (p = uriparser_uri -> pathHead -> next ; p != NULL ; p = p -> next ) {
254
- smart_str_appends (& str , "/" );
268
+ smart_str_appendc (& str , '/' );
255
269
smart_str_appendl (& str , p -> text .first , (int ) ((p -> text ).afterLast - (p -> text ).first ));
256
270
}
257
271
258
- ZVAL_STR (retval , smart_str_extract (& str ));
272
+ ZVAL_NEW_STR (retval , smart_str_extract (& str ));
259
273
} else if (uriparser_uri -> absolutePath ) {
260
274
ZVAL_CHAR (retval , '/' );
261
275
} else {
@@ -267,9 +281,10 @@ static zend_result uriparser_read_path(const uri_internal_t *internal_uri, uri_c
267
281
268
282
static zend_result uriparser_read_query (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
269
283
{
270
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
271
- UriUriA * uriparser_uri ;
272
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
284
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
285
+ if (UNEXPECTED (uriparser_uri == NULL )) {
286
+ return FAILURE ;
287
+ }
273
288
274
289
if (uriparser_uri -> query .first != NULL && uriparser_uri -> query .afterLast != NULL ) {
275
290
ZVAL_STRINGL (retval , uriparser_uri -> query .first , uriparser_uri -> query .afterLast - uriparser_uri -> query .first );
@@ -282,9 +297,10 @@ static zend_result uriparser_read_query(const uri_internal_t *internal_uri, uri_
282
297
283
298
static zend_result uriparser_read_fragment (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
284
299
{
285
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
286
- UriUriA * uriparser_uri ;
287
- URIPARSER_READ_URI (uriparser_uri , uriparser_uris , read_mode );
300
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
301
+ if (UNEXPECTED (uriparser_uri == NULL )) {
302
+ return FAILURE ;
303
+ }
288
304
289
305
if (uriparser_uri -> fragment .first != NULL && uriparser_uri -> fragment .afterLast != NULL ) {
290
306
ZVAL_STRINGL (retval , uriparser_uri -> fragment .first , uriparser_uri -> fragment .afterLast - uriparser_uri -> fragment .first );
@@ -307,38 +323,26 @@ static void *uriparser_calloc(UriMemoryManager *memory_manager, size_t nmemb, si
307
323
308
324
static void * uriparser_realloc (UriMemoryManager * memory_manager , void * ptr , size_t size )
309
325
{
310
- return realloc (ptr , size );
326
+ return erealloc (ptr , size );
311
327
}
312
328
313
329
static void * uriparser_reallocarray (UriMemoryManager * memory_manager , void * ptr , size_t nmemb , size_t size )
314
330
{
315
- const size_t total_size = nmemb * size ;
316
-
317
- /* check for unsigned overflow */
318
- if ((nmemb != 0 ) && (total_size / nmemb != size )) {
319
- errno = ENOMEM ;
320
- return NULL ;
321
- }
322
-
323
- return erealloc (ptr , total_size );
331
+ return safe_erealloc (ptr , nmemb , size , 0 );
324
332
}
325
333
326
334
static void uriparser_free (UriMemoryManager * memory_manager , void * ptr )
327
335
{
328
336
efree (ptr );
329
337
}
330
338
331
- zend_result uriparser_request_init (void )
339
+ void uriparser_module_init (void )
332
340
{
333
- uriparser_memory_manager .calloc = uriparser_calloc ;
334
- uriparser_memory_manager .malloc = uriparser_malloc ;
335
- uriparser_memory_manager .realloc = uriparser_realloc ;
336
- uriparser_memory_manager .reallocarray = uriparser_reallocarray ;
337
- uriparser_memory_manager .free = uriparser_free ;
338
-
339
- zend_hash_init (& uriparser_property_handlers , 8 , NULL , NULL , true);
340
-
341
- return SUCCESS ;
341
+ defaultMemoryManager .malloc = uriparser_malloc ;
342
+ defaultMemoryManager .calloc = uriparser_calloc ;
343
+ defaultMemoryManager .realloc = uriparser_realloc ;
344
+ defaultMemoryManager .reallocarray = uriparser_reallocarray ;
345
+ defaultMemoryManager .free = uriparser_free ;
342
346
}
343
347
344
348
static uriparser_uris_t * uriparser_create_uris (
@@ -357,16 +361,7 @@ static uriparser_uris_t *uriparser_create_uris(
357
361
358
362
static void throw_invalid_uri_exception (void )
359
363
{
360
- zval exception ;
361
-
362
- object_init_ex (& exception , uri_invalid_uri_exception_ce );
363
-
364
- zval value ;
365
- ZVAL_STRING (& value , "URI parsing failed" );
366
- zend_update_property_ex (uri_whatwg_invalid_url_exception_ce , Z_OBJ (exception ), ZSTR_KNOWN (ZEND_STR_MESSAGE ), & value );
367
- zval_ptr_dtor_str (& value );
368
-
369
- zend_throw_exception_object (& exception );
364
+ zend_throw_exception (uri_invalid_uri_exception_ce , "URI parsing failed" , 0 );
370
365
}
371
366
372
367
void * uriparser_parse_uri_ex (const zend_string * uri_str , const uriparser_uris_t * uriparser_base_urls , bool silent )
@@ -376,7 +371,7 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
376
371
/* uriparser keeps the originally passed in string, while lexbor may allocate a new one. */
377
372
zend_string * original_uri_str = zend_string_init (ZSTR_VAL (uri_str ), ZSTR_LEN (uri_str ), false);
378
373
if (ZSTR_LEN (original_uri_str ) == 0 ||
379
- uriParseSingleUriExMmA (uriparser_uri , ZSTR_VAL (original_uri_str ), ZSTR_VAL (original_uri_str ) + ZSTR_LEN (original_uri_str ), NULL , & uriparser_memory_manager ) != URI_SUCCESS
374
+ uriParseSingleUriExA (uriparser_uri , ZSTR_VAL (original_uri_str ), ZSTR_VAL (original_uri_str ) + ZSTR_LEN (original_uri_str ), NULL ) != URI_SUCCESS
380
375
) {
381
376
efree (uriparser_uri );
382
377
zend_string_release_ex (original_uri_str , false);
@@ -395,11 +390,11 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
395
390
396
391
UriUriA * absolute_uri = emalloc (sizeof (UriUriA ));
397
392
398
- if (uriAddBaseUriExMmA (absolute_uri , uriparser_uri , uriparser_base_url , URI_RESOLVE_STRICTLY , & uriparser_memory_manager ) != URI_SUCCESS ) {
393
+ if (uriAddBaseUriExA (absolute_uri , uriparser_uri , uriparser_base_url , URI_RESOLVE_STRICTLY ) != URI_SUCCESS ) {
399
394
zend_string_release_ex (original_uri_str , false);
400
- uriFreeUriMembersMmA (uriparser_uri , & uriparser_memory_manager );
395
+ uriFreeUriMembersA (uriparser_uri );
401
396
efree (uriparser_uri );
402
- uriFreeUriMembersMmA (uriparser_base_url , & uriparser_memory_manager );
397
+ uriFreeUriMembersA (uriparser_base_url );
403
398
efree (uriparser_base_url );
404
399
efree (absolute_uri );
405
400
@@ -412,9 +407,9 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
412
407
413
408
/* TODO fix freeing: if the following code runs, then we'll have use-after-free-s because uriparser doesn't
414
409
copy the input. If we don't run the following code, then we'll have memory leaks...
415
- uriFreeUriMembersMmA (uriparser_base_url, &uriparser_memory_manager );
410
+ uriFreeUriMembersA (uriparser_base_url);
416
411
efree(uriparser_base_url);
417
- uriFreeUriMembersMmA (uriparser_uri, &uriparser_memory_manager );
412
+ uriFreeUriMembersA (uriparser_uri);
418
413
efree(uriparser_uri);
419
414
*/
420
415
@@ -462,12 +457,12 @@ static zend_string *uriparser_uri_to_string(void *uri, uri_recomposition_mode_t
462
457
463
458
zend_string * uri_string = zend_string_alloc (charsRequired - 1 , false);
464
459
if (uriToStringA (ZSTR_VAL (uri_string ), uriparser_uri , charsRequired , NULL ) != URI_SUCCESS ) {
465
- zend_string_release (uri_string );
460
+ zend_string_efree (uri_string );
466
461
return NULL ;
467
462
}
468
463
469
464
if (exclude_fragment ) {
470
- char * pos = strrchr (ZSTR_VAL (uri_string ), '#' );
465
+ const char * pos = zend_memrchr (ZSTR_VAL (uri_string ), '#' , ZSTR_LEN ( uri_string ) );
471
466
if (pos != NULL ) {
472
467
uri_string = zend_string_truncate (uri_string , (pos - ZSTR_VAL (uri_string )), false);
473
468
}
@@ -486,7 +481,7 @@ static void uriparser_free_uri(void *uri)
486
481
uriparser_uris -> uri_str = NULL ;
487
482
}
488
483
489
- uriFreeUriMembersMmA (uriparser_uris -> uri , & uriparser_memory_manager );
484
+ uriFreeUriMembersA (uriparser_uris -> uri );
490
485
efree (uriparser_uris -> uri );
491
486
uriparser_uris -> uri = NULL ;
492
487
}
@@ -498,7 +493,7 @@ static void uriparser_free_uri(void *uri)
498
493
uriparser_uris -> normalized_uri_str = NULL ;
499
494
}
500
495
501
- uriFreeUriMembersMmA (uriparser_uris -> normalized_uri , & uriparser_memory_manager );
496
+ uriFreeUriMembersA (uriparser_uris -> normalized_uri );
502
497
efree (uriparser_uris -> normalized_uri );
503
498
uriparser_uris -> normalized_uri = NULL ;
504
499
}
0 commit comments