@@ -415,7 +415,7 @@ PHP_METHOD(Phar, running)
415415 }
416416
417417 if (zend_string_starts_with_literal_ci (fname , "phar://" )) {
418- zend_string * arch = phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), NULL , 2 , 0 );
418+ zend_string * arch = phar_split_fname (ZSTR_VAL (fname ), ZSTR_LEN (fname ), NULL , NULL , 2 , 0 );
419419 if (retphar ) {
420420 RETVAL_STRINGL (ZSTR_VAL (fname ), ZSTR_LEN (arch ) + 7 );
421421 zend_string_release_ex (arch , false);
@@ -436,8 +436,8 @@ PHP_METHOD(Phar, running)
436436 */
437437PHP_METHOD (Phar , mount )
438438{
439- char * fname , * path , * actual ;
440- size_t fname_len ;
439+ char * fname , * entry = NULL , * path , * actual ;
440+ size_t fname_len , entry_len ;
441441 size_t path_len , actual_len ;
442442 phar_archive_data * pphar ;
443443#ifdef PHP_WIN32
@@ -469,8 +469,9 @@ PHP_METHOD(Phar, mount)
469469#endif
470470
471471 zend_string * arch = NULL ;
472- zend_string * entry = NULL ;
473- if (fname_len > 7 && !memcmp (fname , "phar://" , 7 ) && (arch = phar_split_fname (fname , fname_len , NULL , 2 , 0 ))) {
472+ if (fname_len > 7 && !memcmp (fname , "phar://" , 7 ) && (arch = phar_split_fname (fname , fname_len , NULL , NULL , 2 , 0 ))) {
473+ entry = NULL ;
474+
474475 if (path_len > 7 && !memcmp (path , "phar://" , 7 )) {
475476 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 );
476477 zend_string_release_ex (arch , false);
@@ -494,8 +495,8 @@ PHP_METHOD(Phar, mount)
494495 zend_throw_exception_ex (phar_ce_PharException , 0 , "Mounting of %s to %s within phar %s failed" , path , actual , ZSTR_VAL (arch ));
495496 }
496497
497- if (entry && path == ZSTR_VAL ( entry ) ) {
498- zend_string_release_ex (entry , false );
498+ if (entry && path == entry ) {
499+ efree (entry );
499500 }
500501
501502 if (arch ) {
@@ -511,9 +512,9 @@ PHP_METHOD(Phar, mount)
511512 }
512513
513514 goto carry_on ;
514- } else if (NULL != (arch = phar_split_fname (path , path_len , & entry , 2 , 0 ))) {
515- path = ZSTR_VAL ( entry ) ;
516- path_len = ZSTR_LEN ( entry ) ;
515+ } else if (NULL != (arch = phar_split_fname (path , path_len , & entry , & entry_len , 2 , 0 ))) {
516+ path = entry ;
517+ path_len = entry_len ;
517518 goto carry_on2 ;
518519 }
519520
@@ -1067,8 +1068,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
10671068 */
10681069PHP_METHOD (Phar , __construct )
10691070{
1070- char * fname , * alias = NULL , * error , * save_fname ;
1071+ char * fname , * alias = NULL , * error , * entry = NULL , * save_fname ;
10711072 size_t fname_len , alias_len = 0 ;
1073+ size_t entry_len ;
10721074 bool is_data ;
10731075 zend_long flags = SPL_FILE_DIR_SKIPDOTS |SPL_FILE_DIR_UNIXPATHS ;
10741076 zend_long format = 0 ;
@@ -1099,8 +1101,7 @@ PHP_METHOD(Phar, __construct)
10991101#ifdef PHP_WIN32
11001102 phar_unixify_path_separators (fname , fname_len );
11011103#endif
1102- zend_string * entry = NULL ;
1103- zend_string * arch = phar_split_fname (fname , fname_len , & entry , !is_data , 2 );
1104+ zend_string * arch = phar_split_fname (fname , fname_len , & entry , & entry_len , !is_data , 2 );
11041105 if (arch ) {
11051106 /* use arch (the basename for the archive) for fname instead of fname */
11061107 /* this allows support for RecursiveDirectoryIterator of subdirectories */
@@ -1116,7 +1117,7 @@ PHP_METHOD(Phar, __construct)
11161117 }
11171118
11181119 if (entry ) {
1119- zend_string_release_ex (entry , false );
1120+ efree (entry );
11201121 }
11211122
11221123 if (error ) {
@@ -1149,7 +1150,7 @@ PHP_METHOD(Phar, __construct)
11491150 zend_throw_exception_ex (spl_ce_UnexpectedValueException , 0 ,
11501151 "Phar class can only be used for executable tar and zip archives" );
11511152 }
1152- zend_string_release_ex (entry , false );
1153+ efree (entry );
11531154 RETURN_THROWS ();
11541155 }
11551156
@@ -1167,9 +1168,9 @@ PHP_METHOD(Phar, __construct)
11671168 file_name_for_recursive_director_iterator_constructor = zend_string_concat3 (
11681169 ZEND_STRL ("phar://" ),
11691170 phar_data -> fname , phar_data -> fname_len ,
1170- ZSTR_VAL ( entry ), ZSTR_LEN ( entry )
1171+ entry , entry_len
11711172 );
1172- zend_string_release_ex (entry , false );
1173+ efree (entry );
11731174 } else {
11741175 file_name_for_recursive_director_iterator_constructor = zend_string_concat2 (
11751176 ZEND_STRL ("phar://" ),
@@ -1268,7 +1269,7 @@ PHP_METHOD(Phar, unlinkArchive)
12681269
12691270 const zend_string * zend_file_name = zend_get_executed_filename_ex ();
12701271 if (zend_file_name && zend_string_starts_with_literal_ci (zend_file_name , "phar://" )) {
1271- zend_string * arch = phar_split_fname (ZSTR_VAL (zend_file_name ), ZSTR_LEN (zend_file_name ), NULL , 2 , 0 );
1272+ zend_string * arch = phar_split_fname (ZSTR_VAL (zend_file_name ), ZSTR_LEN (zend_file_name ), NULL , NULL , 2 , 0 );
12721273 if (arch ) {
12731274 if (ZSTR_LEN (arch ) == fname_len && !memcmp (ZSTR_VAL (arch ), fname , ZSTR_LEN (arch ))) {
12741275 zend_string_release_ex (arch , false);
@@ -4372,8 +4373,9 @@ PHP_METHOD(Phar, extractTo)
43724373/* {{{ Construct a Phar entry object */
43734374PHP_METHOD (PharFileInfo , __construct )
43744375{
4375- char * fname , * error ;
4376+ char * fname , * entry , * error ;
43764377 size_t fname_len ;
4378+ size_t entry_len ;
43774379 phar_entry_object * entry_obj ;
43784380 phar_entry_info * entry_info ;
43794381 phar_archive_data * phar_data ;
@@ -4396,8 +4398,7 @@ PHP_METHOD(PharFileInfo, __construct)
43964398 RETURN_THROWS ();
43974399 }
43984400
4399- zend_string * entry = NULL ;
4400- zend_string * arch = phar_split_fname (fname , fname_len , & entry , 2 , 0 );
4401+ zend_string * arch = phar_split_fname (fname , fname_len , & entry , & entry_len , 2 , 0 );
44014402 if (!arch ) {
44024403 zend_throw_exception_ex (spl_ce_RuntimeException , 0 ,
44034404 "'%s' is not a valid phar archive URL (must have at least phar://filename.phar)" , fname );
@@ -4406,7 +4407,7 @@ PHP_METHOD(PharFileInfo, __construct)
44064407
44074408 if (phar_open_from_filename (ZSTR_VAL (arch ), ZSTR_LEN (arch ), NULL , 0 , REPORT_ERRORS , & phar_data , & error ) == FAILURE ) {
44084409 zend_string_release_ex (arch , false);
4409- zend_string_release_ex (entry , false );
4410+ efree (entry );
44104411 if (error ) {
44114412 zend_throw_exception_ex (spl_ce_RuntimeException , 0 ,
44124413 "Cannot open phar file '%s': %s" , fname , error );
@@ -4418,16 +4419,16 @@ PHP_METHOD(PharFileInfo, __construct)
44184419 RETURN_THROWS ();
44194420 }
44204421
4421- if ((entry_info = phar_get_entry_info_dir (phar_data , ZSTR_VAL ( entry ), ZSTR_LEN ( entry ) , 1 , & error , true)) == NULL ) {
4422+ if ((entry_info = phar_get_entry_info_dir (phar_data , entry , entry_len , 1 , & error , true)) == NULL ) {
44224423 zend_throw_exception_ex (spl_ce_RuntimeException , 0 ,
4423- "Cannot access phar file entry '%s' in archive '%s'%s%s" , ZSTR_VAL ( entry ) , ZSTR_VAL (arch ), error ? ", " : "" , error ? error : "" );
4424+ "Cannot access phar file entry '%s' in archive '%s'%s%s" , entry , ZSTR_VAL (arch ), error ? ", " : "" , error ? error : "" );
44244425 zend_string_release_ex (arch , false);
4425- zend_string_release_ex (entry , false );
4426+ efree (entry );
44264427 RETURN_THROWS ();
44274428 }
44284429
44294430 zend_string_release_ex (arch , false);
4430- zend_string_release_ex (entry , false );
4431+ efree (entry );
44314432
44324433 entry_obj -> entry = entry_info ;
44334434 if (!entry_info -> is_persistent && !entry_info -> is_temp_dir ) {
0 commit comments