20
20
#include "Zend/zend_smart_str.h"
21
21
#include "Zend/zend_exceptions.h"
22
22
23
- void * uriparser_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors , bool silent );
24
23
static void uriparser_free_uri (void * uri );
25
24
static void throw_invalid_uri_exception (void );
26
25
@@ -370,15 +369,13 @@ PHP_MINIT_FUNCTION(uri_uriparser)
370
369
}
371
370
372
371
static uriparser_uris_t * uriparser_create_uris (
373
- UriUriA * uri , zend_string * uri_str ,
374
- UriUriA * normalized_uri , zend_string * normalized_uri_str
372
+ UriUriA * uri ,
373
+ UriUriA * normalized_uri
375
374
) {
376
375
uriparser_uris_t * uriparser_uris = emalloc (sizeof (uriparser_uris_t ));
377
376
378
377
uriparser_uris -> uri = uri ;
379
- uriparser_uris -> uri_str = uri_str ;
380
378
uriparser_uris -> normalized_uri = normalized_uri ;
381
- uriparser_uris -> normalized_uri_str = normalized_uri_str ;
382
379
383
380
return uriparser_uris ;
384
381
}
@@ -392,34 +389,27 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
392
389
{
393
390
UriUriA * uriparser_uri = emalloc (sizeof (UriUriA ));
394
391
395
- /* uriparser keeps the originally passed in string, while lexbor may allocate a new one. */
396
- zend_string * original_uri_str = zend_string_init (ZSTR_VAL (uri_str ), ZSTR_LEN (uri_str ), false);
397
- if (ZSTR_LEN (original_uri_str ) == 0 ||
398
- uriParseSingleUriExA (uriparser_uri , ZSTR_VAL (original_uri_str ), ZSTR_VAL (original_uri_str ) + ZSTR_LEN (original_uri_str ), NULL ) != URI_SUCCESS
392
+ if (ZSTR_LEN (uri_str ) == 0 ||
393
+ uriParseSingleUriExA (uriparser_uri , ZSTR_VAL (uri_str ), ZSTR_VAL (uri_str ) + ZSTR_LEN (uri_str ), NULL ) != URI_SUCCESS
399
394
) {
400
395
efree (uriparser_uri );
401
- zend_string_release_ex (original_uri_str , false);
402
396
if (!silent ) {
403
397
throw_invalid_uri_exception ();
404
398
}
405
399
406
400
return NULL ;
407
401
}
408
402
403
+ uriMakeOwnerA (uriparser_uri );
409
404
if (uriparser_base_urls == NULL ) {
410
- return uriparser_create_uris (uriparser_uri , original_uri_str , NULL , NULL );
405
+ return uriparser_create_uris (uriparser_uri , NULL );
411
406
}
412
407
413
- UriUriA * uriparser_base_url = uriparser_copy_uri (uriparser_base_urls -> uri );
414
-
415
408
UriUriA * absolute_uri = emalloc (sizeof (UriUriA ));
416
409
417
- if (uriAddBaseUriExA (absolute_uri , uriparser_uri , uriparser_base_url , URI_RESOLVE_STRICTLY ) != URI_SUCCESS ) {
418
- zend_string_release_ex (original_uri_str , false);
410
+ if (uriAddBaseUriExA (absolute_uri , uriparser_uri , uriparser_base_urls -> uri , URI_RESOLVE_STRICTLY ) != URI_SUCCESS ) {
419
411
uriFreeUriMembersA (uriparser_uri );
420
412
efree (uriparser_uri );
421
- uriFreeUriMembersA (uriparser_base_url );
422
- efree (uriparser_base_url );
423
413
efree (absolute_uri );
424
414
425
415
if (!silent ) {
@@ -429,15 +419,11 @@ void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t
429
419
return NULL ;
430
420
}
431
421
432
- /* TODO fix freeing: if the following code runs, then we'll have use-after-free-s because uriparser doesn't
433
- copy the input. If we don't run the following code, then we'll have memory leaks...
434
- uriFreeUriMembersA(uriparser_base_url);
435
- efree(uriparser_base_url);
422
+ uriMakeOwnerA (absolute_uri );
436
423
uriFreeUriMembersA (uriparser_uri );
437
424
efree (uriparser_uri );
438
- */
439
425
440
- return uriparser_create_uris (absolute_uri , original_uri_str , NULL , NULL );
426
+ return uriparser_create_uris (absolute_uri , NULL );
441
427
}
442
428
443
429
void * uriparser_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors , bool silent )
@@ -451,9 +437,7 @@ static void *uriparser_clone_uri(void *uri)
451
437
452
438
return uriparser_create_uris (
453
439
uriparser_copy_uri (uriparser_uris -> uri ),
454
- zend_string_copy (uriparser_uris -> uri_str ),
455
- uriparser_uris -> normalized_uri != NULL ? uriparser_copy_uri (uriparser_uris -> normalized_uri ) : NULL ,
456
- uriparser_uris -> normalized_uri_str != NULL ? zend_string_copy (uriparser_uris -> normalized_uri_str ) : NULL
440
+ uriparser_uris -> normalized_uri != NULL ? uriparser_copy_uri (uriparser_uris -> normalized_uri ) : NULL
457
441
);
458
442
}
459
443
@@ -500,22 +484,13 @@ static void uriparser_free_uri(void *uri)
500
484
uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) uri ;
501
485
502
486
if (uriparser_uris -> uri != NULL ) {
503
- if (uriparser_uris -> uri_str != NULL ) { // TODO can this double free? should we check uriparser_uris->uri->owner?
504
- zend_string_release (uriparser_uris -> uri_str );
505
- uriparser_uris -> uri_str = NULL ;
506
- }
507
-
508
487
uriFreeUriMembersA (uriparser_uris -> uri );
509
488
efree (uriparser_uris -> uri );
510
489
uriparser_uris -> uri = NULL ;
511
490
}
512
491
513
492
if (uriparser_uris -> normalized_uri != NULL ) {
514
493
ZEND_ASSERT (uriparser_uris -> normalized_uri -> owner );
515
- if (uriparser_uris -> normalized_uri_str != NULL ) {
516
- zend_string_release (uriparser_uris -> normalized_uri_str );
517
- uriparser_uris -> normalized_uri_str = NULL ;
518
- }
519
494
520
495
uriFreeUriMembersA (uriparser_uris -> normalized_uri );
521
496
efree (uriparser_uris -> normalized_uri );
0 commit comments