@@ -419,7 +419,7 @@ PHP_METHOD(Phar, running)
419419
420420 if (
421421 zend_string_starts_with_literal_ci (fname , "phar://" )
422- && SUCCESS == phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), & arch , & arch_len , NULL , NULL , 2 , 0 )
422+ && SUCCESS == phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), & arch , & arch_len , NULL , 2 , 0 )
423423 ) {
424424 if (retphar ) {
425425 RETVAL_STRINGL (ZSTR_VAL (fname ), arch_len + 7 );
@@ -444,8 +444,8 @@ PHP_METHOD(Phar, running)
444444 */
445445PHP_METHOD (Phar , mount )
446446{
447- char * fname , * arch = NULL , * entry = NULL , * path , * actual ;
448- size_t fname_len , arch_len , entry_len ;
447+ char * fname , * arch = NULL , * path , * actual ;
448+ size_t fname_len , arch_len ;
449449 size_t path_len , actual_len ;
450450 phar_archive_data * pphar ;
451451#ifdef PHP_WIN32
@@ -476,9 +476,8 @@ PHP_METHOD(Phar, mount)
476476 }
477477#endif
478478
479- if (fname_len > 7 && !memcmp (fname , "phar://" , 7 ) && SUCCESS == phar_split_fname (fname , fname_len , & arch , & arch_len , NULL , NULL , 2 , 0 )) {
480- entry = NULL ;
481-
479+ zend_string * entry = NULL ;
480+ if (fname_len > 7 && !memcmp (fname , "phar://" , 7 ) && SUCCESS == phar_split_fname (fname , fname_len , & arch , & arch_len , NULL , 2 , 0 )) {
482481 if (path_len > 7 && !memcmp (path , "phar://" , 7 )) {
483482 zend_throw_exception_ex (phar_ce_PharException , 0 , "Can only mount internal paths within a phar archive, use a relative path instead of \"%s\"" , path );
484483 efree (arch );
@@ -505,8 +504,8 @@ PHP_METHOD(Phar, mount)
505504 zend_throw_exception_ex (phar_ce_PharException , 0 , "Mounting of %s to %s within phar %s failed" , path , actual , arch );
506505 }
507506
508- if (entry && path == entry ) {
509- efree (entry );
507+ if (entry && path == ZSTR_VAL ( entry ) ) {
508+ zend_string_release_ex (entry , false );
510509 }
511510
512511 if (arch ) {
@@ -522,9 +521,9 @@ PHP_METHOD(Phar, mount)
522521 }
523522
524523 goto carry_on ;
525- } else if (SUCCESS == phar_split_fname (path , path_len , & arch , & arch_len , & entry , & entry_len , 2 , 0 )) {
526- path = entry ;
527- path_len = entry_len ;
524+ } else if (SUCCESS == phar_split_fname (path , path_len , & arch , & arch_len , & entry , 2 , 0 )) {
525+ path = ZSTR_VAL ( entry ) ;
526+ path_len = ZSTR_LEN ( entry ) ;
528527 goto carry_on2 ;
529528 }
530529
@@ -1078,9 +1077,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
10781077 */
10791078PHP_METHOD (Phar , __construct )
10801079{
1081- char * fname , * alias = NULL , * error , * arch = NULL , * entry = NULL , * save_fname ;
1080+ char * fname , * alias = NULL , * error , * arch = NULL , * save_fname ;
10821081 size_t fname_len , alias_len = 0 ;
1083- size_t arch_len , entry_len ;
1082+ size_t arch_len ;
10841083 bool is_data ;
10851084 zend_long flags = SPL_FILE_DIR_SKIPDOTS |SPL_FILE_DIR_UNIXPATHS ;
10861085 zend_long format = 0 ;
@@ -1108,7 +1107,8 @@ PHP_METHOD(Phar, __construct)
11081107 }
11091108
11101109 save_fname = fname ;
1111- if (SUCCESS == phar_split_fname (fname , fname_len , & arch , & arch_len , & entry , & entry_len , !is_data , 2 )) {
1110+ zend_string * entry = NULL ;
1111+ if (SUCCESS == phar_split_fname (fname , fname_len , & arch , & arch_len , & entry , !is_data , 2 )) {
11121112 /* use arch (the basename for the archive) for fname instead of fname */
11131113 /* this allows support for RecursiveDirectoryIterator of subdirectories */
11141114#ifdef PHP_WIN32
@@ -1133,7 +1133,7 @@ PHP_METHOD(Phar, __construct)
11331133 }
11341134
11351135 if (entry ) {
1136- efree (entry );
1136+ zend_string_release_ex (entry , false );
11371137 }
11381138
11391139 if (error ) {
@@ -1166,7 +1166,7 @@ PHP_METHOD(Phar, __construct)
11661166 zend_throw_exception_ex (spl_ce_UnexpectedValueException , 0 ,
11671167 "Phar class can only be used for executable tar and zip archives" );
11681168 }
1169- efree (entry );
1169+ zend_string_release_ex (entry , false );
11701170 RETURN_THROWS ();
11711171 }
11721172
@@ -1184,9 +1184,9 @@ PHP_METHOD(Phar, __construct)
11841184 file_name_for_recursive_director_iterator_constructor = zend_string_concat3 (
11851185 ZEND_STRL ("phar://" ),
11861186 phar_data -> fname , phar_data -> fname_len ,
1187- entry , entry_len
1187+ ZSTR_VAL ( entry ), ZSTR_LEN ( entry )
11881188 );
1189- efree (entry );
1189+ zend_string_release_ex (entry , false );
11901190 } else {
11911191 file_name_for_recursive_director_iterator_constructor = zend_string_concat2 (
11921192 ZEND_STRL ("phar://" ),
@@ -1289,7 +1289,7 @@ PHP_METHOD(Phar, unlinkArchive)
12891289 if (
12901290 zend_file_name
12911291 && zend_string_starts_with_literal_ci (zend_file_name , "phar://" )
1292- && SUCCESS == phar_split_fname (ZSTR_VAL (zend_file_name ), ZSTR_LEN (zend_file_name ), & arch , & arch_len , NULL , NULL , 2 , 0 )
1292+ && SUCCESS == phar_split_fname (ZSTR_VAL (zend_file_name ), ZSTR_LEN (zend_file_name ), & arch , & arch_len , NULL , 2 , 0 )
12931293 ) {
12941294 if (arch_len == fname_len && !memcmp (arch , fname , arch_len )) {
12951295 zend_throw_exception_ex (phar_ce_PharException , 0 , "phar archive \"%s\" cannot be unlinked from within itself" , fname );
@@ -4392,11 +4392,10 @@ PHP_METHOD(Phar, extractTo)
43924392/* {{{ Construct a Phar entry object */
43934393PHP_METHOD (PharFileInfo , __construct )
43944394{
4395- char * fname , * arch , * entry , * error ;
4395+ char * fname , * arch , * error ;
43964396 size_t fname_len ;
4397- size_t arch_len , entry_len ;
4397+ size_t arch_len ;
43984398 phar_entry_object * entry_obj ;
4399- phar_entry_info * entry_info ;
44004399 phar_archive_data * phar_data ;
44014400 zval arg1 ;
44024401
@@ -4411,7 +4410,8 @@ PHP_METHOD(PharFileInfo, __construct)
44114410 RETURN_THROWS ();
44124411 }
44134412
4414- if (fname_len < 7 || memcmp (fname , "phar://" , 7 ) || phar_split_fname (fname , fname_len , & arch , & arch_len , & entry , & entry_len , 2 , 0 ) == FAILURE ) {
4413+ zend_string * entry = NULL ;
4414+ if (fname_len < 7 || memcmp (fname , "phar://" , 7 ) || phar_split_fname (fname , fname_len , & arch , & arch_len , & entry , 2 , 0 ) == FAILURE ) {
44154415 zend_throw_exception_ex (spl_ce_RuntimeException , 0 ,
44164416 "'%s' is not a valid phar archive URL (must have at least phar://filename.phar)" , fname );
44174417 RETURN_THROWS ();
@@ -4431,16 +4431,17 @@ PHP_METHOD(PharFileInfo, __construct)
44314431 RETURN_THROWS ();
44324432 }
44334433
4434- if ((entry_info = phar_get_entry_info_dir (phar_data , entry , entry_len , 1 , & error , true)) == NULL ) {
4434+ phar_entry_info * entry_info = phar_get_entry_info_dir (phar_data , ZSTR_VAL (entry ), ZSTR_LEN (entry ), 1 , & error , true);
4435+ if (UNEXPECTED (!entry_info )) {
44354436 zend_throw_exception_ex (spl_ce_RuntimeException , 0 ,
4436- "Cannot access phar file entry '%s' in archive '%s'%s%s" , entry , arch , error ? ", " : "" , error ? error : "" );
4437+ "Cannot access phar file entry '%s' in archive '%s'%s%s" , ZSTR_VAL (entry ), arch , error ? ", " : "" , error ? error : "" );
4438+ zend_string_release_ex (entry , false);
44374439 efree (arch );
4438- efree (entry );
44394440 RETURN_THROWS ();
44404441 }
44414442
4443+ zend_string_release_ex (entry , false);
44424444 efree (arch );
4443- efree (entry );
44444445
44454446 entry_obj -> entry = entry_info ;
44464447 if (!entry_info -> is_persistent && !entry_info -> is_temp_dir ) {
0 commit comments