@@ -1081,8 +1081,9 @@ static const spl_other_handler phar_spl_foreign_handler = {
10811081 */
10821082PHP_METHOD (Phar , __construct )
10831083{
1084- char * fname , * alias = NULL , * error , * save_fname ;
1085- size_t fname_len , alias_len = 0 ;
1084+ zend_string * fname ;
1085+ char * alias = NULL , * error ;
1086+ size_t alias_len = 0 ;
10861087 bool is_data ;
10871088 zend_long flags = SPL_FILE_DIR_SKIPDOTS |SPL_FILE_DIR_UNIXPATHS ;
10881089 zend_long format = 0 ;
@@ -1095,11 +1096,11 @@ PHP_METHOD(Phar, __construct)
10951096 is_data = instanceof_function (Z_OBJCE_P (ZEND_THIS ), phar_ce_data );
10961097
10971098 if (is_data ) {
1098- if (zend_parse_parameters (ZEND_NUM_ARGS (), "p |ls!l" , & fname , & fname_len , & flags , & alias , & alias_len , & format ) == FAILURE ) {
1099+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "P |ls!l" , & fname , & flags , & alias , & alias_len , & format ) == FAILURE ) {
10991100 RETURN_THROWS ();
11001101 }
11011102 } else {
1102- if (zend_parse_parameters (ZEND_NUM_ARGS (), "p |ls!" , & fname , & fname_len , & flags , & alias , & alias_len ) == FAILURE ) {
1103+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "P |ls!" , & fname , & flags , & alias , & alias_len ) == FAILURE ) {
11031104 RETURN_THROWS ();
11041105 }
11051106 }
@@ -1109,23 +1110,22 @@ PHP_METHOD(Phar, __construct)
11091110 RETURN_THROWS ();
11101111 }
11111112
1112- save_fname = fname ;
11131113 zend_string * entry = NULL ;
11141114 /* phar_split_fname() will unixify the path */
1115- zend_string * arch = phar_split_fname (fname , fname_len , & entry , !is_data , 2 );
1115+ zend_string * arch = phar_split_fname (ZSTR_VAL ( fname ), ZSTR_LEN ( fname ) , & entry , !is_data , 2 );
11161116 if (arch ) {
11171117 /* use arch (the basename for the archive) for fname instead of fname */
11181118 /* this allows support for RecursiveDirectoryIterator of subdirectories */
1119- fname = ZSTR_VAL (arch );
1120- fname_len = ZSTR_LEN (arch );
1119+ fname = arch ;
11211120 }
11221121
1123- if ( phar_open_or_create_filename (fname , fname_len , alias , alias_len , is_data , REPORT_ERRORS , & phar_data , & error ) == FAILURE ) {
1122+ zend_result phar_status = phar_open_or_create_filename (ZSTR_VAL ( fname ), ZSTR_LEN ( fname ) , alias , alias_len , is_data , REPORT_ERRORS , & phar_data , & error );
11241123
1125- if (arch && fname == ZSTR_VAL (arch ) && fname != save_fname ) {
1126- zend_string_release_ex (arch , false);
1127- fname = save_fname ;
1128- }
1124+ if (arch ) {
1125+ zend_string_release_ex (arch , false);
1126+ }
1127+
1128+ if (phar_status == FAILURE ) {
11291129
11301130 if (entry ) {
11311131 zend_string_release_ex (entry , false);
@@ -1148,11 +1148,6 @@ PHP_METHOD(Phar, __construct)
11481148 phar_data -> is_tar = false;
11491149 }
11501150
1151- if (arch && fname == ZSTR_VAL (arch )) {
1152- zend_string_release_ex (arch , false);
1153- fname = save_fname ;
1154- }
1155-
11561151 if ((is_data && !phar_data -> is_data ) || (!is_data && phar_data -> is_data )) {
11571152 if (is_data ) {
11581153 zend_throw_exception_ex (spl_ce_UnexpectedValueException , 0 ,
0 commit comments