@@ -133,7 +133,7 @@ static void phar_split_cache_list(void) /* {{{ */
133
133
len = strlen (key );
134
134
}
135
135
136
- if (SUCCESS == phar_open_from_filename (key , len , NULL , 0 , 0 , & phar , NULL )) {
136
+ if (SUCCESS == phar_open_from_filename (key , len , NULL , 0 , & phar , NULL )) {
137
137
phar -> phar_pos = i ++ ;
138
138
php_stream_close (phar -> fp );
139
139
phar -> fp = NULL ;
@@ -194,8 +194,8 @@ PHP_INI_END()
194
194
*/
195
195
void phar_destroy_phar_data (phar_archive_data * phar ) /* {{{ */
196
196
{
197
- if (phar -> alias && phar -> alias != phar -> fname ) {
198
- pefree (phar -> alias , phar -> is_persistent );
197
+ if (phar -> alias ) {
198
+ zend_string_release_ex (phar -> alias , phar -> is_persistent );
199
199
phar -> alias = NULL ;
200
200
}
201
201
@@ -258,7 +258,8 @@ bool phar_archive_delref(phar_archive_data *phar) /* {{{ */
258
258
} else if (!phar -> refcount ) {
259
259
/* invalidate phar cache */
260
260
PHAR_G (last_phar ) = NULL ;
261
- PHAR_G (last_phar_name ) = PHAR_G (last_alias ) = NULL ;
261
+ PHAR_G (last_phar_name ) = NULL ;
262
+ PHAR_G (last_alias ) = NULL ;
262
263
263
264
if (phar -> fp && (!(phar -> flags & PHAR_FILE_COMPRESSION_MASK ) || !phar -> alias )) {
264
265
/* close open file handle - allows removal or rename of
@@ -486,7 +487,7 @@ void phar_entry_remove(phar_entry_data *idata, char **error) /* {{{ */
486
487
/**
487
488
* Open an already loaded phar
488
489
*/
489
- static zend_result phar_open_parsed_phar (char * fname , size_t fname_len , char * alias , size_t alias_len , bool is_data , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
490
+ static zend_result phar_open_parsed_phar (char * fname , size_t fname_len , zend_string * alias , bool is_data , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
490
491
{
491
492
phar_archive_data * phar ;
492
493
#ifdef PHP_WIN32
@@ -506,7 +507,7 @@ static zend_result phar_open_parsed_phar(char *fname, size_t fname_len, char *al
506
507
phar_unixify_path_separators (fname , fname_len );
507
508
}
508
509
#endif
509
- if (SUCCESS == phar_get_archive (& phar , fname , fname_len , alias , alias_len , error )
510
+ if (SUCCESS == phar_get_archive (& phar , fname , fname_len , alias , error )
510
511
&& ((alias && fname_len == phar -> fname_len
511
512
&& !strncmp (fname , phar -> fname , fname_len )) || !alias )
512
513
) {
@@ -1256,9 +1257,11 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
1256
1257
}
1257
1258
1258
1259
mydata -> alias = alias ?
1259
- pestrndup (alias , alias_len , mydata -> is_persistent ) :
1260
- pestrndup (mydata -> fname , fname_len , mydata -> is_persistent );
1261
- mydata -> alias_len = alias ? alias_len : fname_len ;
1260
+ zend_string_init (alias , alias_len , mydata -> is_persistent ) :
1261
+ zend_string_init (mydata -> fname , fname_len , mydata -> is_persistent );
1262
+ if (mydata -> is_persistent ) {
1263
+ GC_MAKE_PERSISTENT_LOCAL (mydata -> alias );
1264
+ }
1262
1265
mydata -> sig_flags = sig_flags ;
1263
1266
mydata -> fp = fp ;
1264
1267
mydata -> sig_len = sig_len ;
@@ -1270,7 +1273,7 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
1270
1273
1271
1274
mydata -> is_temporary_alias = temp_alias ;
1272
1275
1273
- if (!phar_validate_alias (mydata -> alias , mydata -> alias_len )) {
1276
+ if (!phar_validate_alias (ZSTR_VAL ( mydata -> alias ), ZSTR_LEN ( mydata -> alias ) )) {
1274
1277
signature = NULL ;
1275
1278
fp = NULL ;
1276
1279
MAPPHAR_FAIL ("Cannot open archive \"%s\", invalid alias" );
@@ -1315,7 +1318,7 @@ static zend_result phar_parse_pharfile(php_stream *fp, char *fname, size_t fname
1315
1318
/**
1316
1319
* Create or open a phar for writing
1317
1320
*/
1318
- zend_result phar_open_or_create_filename (char * fname , size_t fname_len , char * alias , size_t alias_len , bool is_data , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
1321
+ zend_result phar_open_or_create_filename (char * fname , size_t fname_len , zend_string * alias , bool is_data , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
1319
1322
{
1320
1323
const char * ext_str , * z ;
1321
1324
char * my_error ;
@@ -1345,7 +1348,7 @@ zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *al
1345
1348
return FAILURE ;
1346
1349
}
1347
1350
check_file :
1348
- if (phar_open_parsed_phar (fname , fname_len , alias , alias_len , is_data , options , test , & my_error ) == SUCCESS ) {
1351
+ if (phar_open_parsed_phar (fname , fname_len , alias , is_data , options , test , & my_error ) == SUCCESS ) {
1349
1352
if (pphar ) {
1350
1353
* pphar = * test ;
1351
1354
}
@@ -1380,15 +1383,15 @@ zend_result phar_open_or_create_filename(char *fname, size_t fname_len, char *al
1380
1383
1381
1384
if (ext_len > 3 && (z = memchr (ext_str , 'z' , ext_len )) && ((ext_str + ext_len ) - z >= 2 ) && !memcmp (z + 1 , "ip" , 2 )) {
1382
1385
/* assume zip-based phar */
1383
- return phar_open_or_create_zip (fname , fname_len , alias , alias_len , is_data , options , pphar , error );
1386
+ return phar_open_or_create_zip (fname , fname_len , alias ? ZSTR_VAL ( alias ) : NULL , alias ? ZSTR_LEN ( alias ) : 0 , is_data , options , pphar , error );
1384
1387
}
1385
1388
1386
1389
if (ext_len > 3 && (z = memchr (ext_str , 't' , ext_len )) && ((ext_str + ext_len ) - z >= 2 ) && !memcmp (z + 1 , "ar" , 2 )) {
1387
1390
/* assume tar-based phar */
1388
- return phar_open_or_create_tar (fname , fname_len , alias , alias_len , is_data , options , pphar , error );
1391
+ return phar_open_or_create_tar (fname , fname_len , alias ? ZSTR_VAL ( alias ) : NULL , alias ? ZSTR_LEN ( alias ) : 0 , is_data , options , pphar , error );
1389
1392
}
1390
1393
1391
- return phar_create_or_parse_filename (fname , fname_len , alias , alias_len , is_data , options , pphar , error );
1394
+ return phar_create_or_parse_filename (fname , fname_len , alias ? ZSTR_VAL ( alias ) : NULL , alias ? ZSTR_LEN ( alias ) : 0 , is_data , options , pphar , error );
1392
1395
}
1393
1396
/* }}} */
1394
1397
@@ -1515,8 +1518,7 @@ zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *a
1515
1518
}
1516
1519
1517
1520
ZEND_ASSERT (!mydata -> is_persistent );
1518
- mydata -> alias = alias ? estrndup (alias , alias_len ) : estrndup (mydata -> fname , fname_len );
1519
- mydata -> alias_len = alias ? alias_len : fname_len ;
1521
+ mydata -> alias = alias ? zend_string_init (alias , alias_len , false) : zend_string_init (mydata -> fname , fname_len , false);
1520
1522
}
1521
1523
1522
1524
if (alias_len && alias ) {
@@ -1548,7 +1550,7 @@ zend_result phar_create_or_parse_filename(char *fname, size_t fname_len, char *a
1548
1550
* that the manifest is proper, then pass it to phar_parse_pharfile(). SUCCESS
1549
1551
* or FAILURE is returned and pphar is set to a pointer to the phar's manifest
1550
1552
*/
1551
- zend_result phar_open_from_filename (char * fname , size_t fname_len , char * alias , size_t alias_len , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
1553
+ zend_result phar_open_from_filename (char * fname , size_t fname_len , zend_string * alias , uint32_t options , phar_archive_data * * pphar , char * * error ) /* {{{ */
1552
1554
{
1553
1555
php_stream * fp ;
1554
1556
zend_string * actual ;
@@ -1562,7 +1564,7 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
1562
1564
is_data = true;
1563
1565
}
1564
1566
1565
- if (phar_open_parsed_phar (fname , fname_len , alias , alias_len , is_data , options , pphar , error ) == SUCCESS ) {
1567
+ if (phar_open_parsed_phar (fname , fname_len , alias , is_data , options , pphar , error ) == SUCCESS ) {
1566
1568
return SUCCESS ;
1567
1569
} else if (error && * error ) {
1568
1570
return FAILURE ;
@@ -1590,7 +1592,7 @@ zend_result phar_open_from_filename(char *fname, size_t fname_len, char *alias,
1590
1592
fname_len = ZSTR_LEN (actual );
1591
1593
}
1592
1594
1593
- zend_result ret = phar_open_from_fp (fp , fname , fname_len , alias , alias_len , options , pphar , error );
1595
+ zend_result ret = phar_open_from_fp (fp , fname , fname_len , alias ? ZSTR_VAL ( alias ) : NULL , alias ? ZSTR_LEN ( alias ) : 0 , options , pphar , error );
1594
1596
1595
1597
if (actual ) {
1596
1598
zend_string_release_ex (actual , 0 );
@@ -2322,7 +2324,7 @@ zend_result phar_split_fname(const char *filename, size_t filename_len, char **a
2322
2324
* Invoked when a user calls Phar::mapPhar() from within an executing .phar
2323
2325
* to set up its manifest directly
2324
2326
*/
2325
- zend_result phar_open_executed_filename (char * alias , size_t alias_len , char * * error ) /* {{{ */
2327
+ zend_result phar_open_executed_filename (zend_string * alias , char * * error ) /* {{{ */
2326
2328
{
2327
2329
if (error ) {
2328
2330
* error = NULL ;
@@ -2337,7 +2339,7 @@ zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **er
2337
2339
return FAILURE ;
2338
2340
}
2339
2341
2340
- if (phar_open_parsed_phar (ZSTR_VAL (fname ), ZSTR_LEN (fname ), alias , alias_len , 0 , REPORT_ERRORS , NULL , 0 ) == SUCCESS ) {
2342
+ if (phar_open_parsed_phar (ZSTR_VAL (fname ), ZSTR_LEN (fname ), alias , 0 , REPORT_ERRORS , NULL , 0 ) == SUCCESS ) {
2341
2343
return SUCCESS ;
2342
2344
}
2343
2345
@@ -2370,7 +2372,7 @@ zend_result phar_open_executed_filename(char *alias, size_t alias_len, char **er
2370
2372
fname = actual ;
2371
2373
}
2372
2374
2373
- zend_result ret = phar_open_from_fp (fp , ZSTR_VAL (fname ), ZSTR_LEN (fname ), alias , alias_len , REPORT_ERRORS , NULL , error );
2375
+ zend_result ret = phar_open_from_fp (fp , ZSTR_VAL (fname ), ZSTR_LEN (fname ), alias ? ZSTR_VAL ( alias ) : NULL , alias ? ZSTR_LEN ( alias ) : 0 , REPORT_ERRORS , NULL , error );
2374
2376
2375
2377
if (actual ) {
2376
2378
zend_string_release_ex (actual , 0 );
@@ -2544,7 +2546,7 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
2544
2546
2545
2547
phar_entry_info * entry , * newentry ;
2546
2548
size_t halt_offset ;
2547
- int restore_alias_len , global_flags = 0 ;
2549
+ int global_flags = 0 ;
2548
2550
bool must_close_old_file = false;
2549
2551
bool has_dirs = false;
2550
2552
char manifest [18 ], entry_buffer [24 ];
@@ -2860,12 +2862,14 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
2860
2862
* 4: phar metadata length
2861
2863
* ?: phar metadata
2862
2864
*/
2863
- restore_alias_len = phar -> alias_len ;
2865
+ size_t written_alias_len ;
2864
2866
if (phar -> is_temporary_alias ) {
2865
- phar -> alias_len = 0 ;
2867
+ written_alias_len = 0 ;
2868
+ } else {
2869
+ written_alias_len = ZSTR_LEN (phar -> alias ); // TODO: null alias?
2866
2870
}
2867
2871
2868
- manifest_len = offset + phar -> alias_len + sizeof (manifest ) + (main_metadata_str .s ? ZSTR_LEN (main_metadata_str .s ) : 0 );
2872
+ manifest_len = offset + written_alias_len + sizeof (manifest ) + (main_metadata_str .s ? ZSTR_LEN (main_metadata_str .s ) : 0 );
2869
2873
phar_set_32 (manifest , manifest_len );
2870
2874
/* Hack - see bug #65028, add padding byte to the end of the manifest */
2871
2875
if (manifest [0 ] == '\r' || manifest [0 ] == '\n' ) {
@@ -2882,18 +2886,17 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
2882
2886
* (manifest + 9 ) = (unsigned char ) (((PHAR_API_VERSION_NODIR ) & 0xF0 ));
2883
2887
}
2884
2888
phar_set_32 (manifest + 10 , global_flags );
2885
- phar_set_32 (manifest + 14 , phar -> alias_len );
2889
+ phar_set_32 (manifest + 14 , written_alias_len );
2886
2890
2887
2891
/* write the manifest header */
2888
2892
if (sizeof (manifest ) != php_stream_write (newfile , manifest , sizeof (manifest ))
2889
- || ( size_t ) phar -> alias_len != php_stream_write (newfile , phar -> alias , phar -> alias_len )) {
2893
+ || written_alias_len != php_stream_write (newfile , ZSTR_VAL ( phar -> alias ), written_alias_len )) {
2890
2894
2891
2895
if (must_close_old_file ) {
2892
2896
php_stream_close (oldfile );
2893
2897
}
2894
2898
2895
2899
php_stream_close (newfile );
2896
- phar -> alias_len = restore_alias_len ;
2897
2900
2898
2901
if (error ) {
2899
2902
spprintf (error , 0 , "unable to write manifest header of new phar \"%s\"" , phar -> fname );
@@ -2902,8 +2905,6 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
2902
2905
goto cleanup ;
2903
2906
}
2904
2907
2905
- phar -> alias_len = restore_alias_len ;
2906
-
2907
2908
phar_set_32 (manifest , main_metadata_str .s ? ZSTR_LEN (main_metadata_str .s ) : 0 );
2908
2909
if (4 != php_stream_write (newfile , manifest , 4 ) || ((main_metadata_str .s ? ZSTR_LEN (main_metadata_str .s ) : 0 )
2909
2910
&& ZSTR_LEN (main_metadata_str .s ) != php_stream_write (newfile , ZSTR_VAL (main_metadata_str .s ), ZSTR_LEN (main_metadata_str .s )))) {
@@ -2914,7 +2915,6 @@ void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_defa
2914
2915
}
2915
2916
2916
2917
php_stream_close (newfile );
2917
- phar -> alias_len = restore_alias_len ;
2918
2918
2919
2919
if (error ) {
2920
2920
spprintf (error , 0 , "unable to write manifest meta-data of new phar \"%s\"" , phar -> fname );
@@ -3271,7 +3271,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
3271
3271
return phar_orig_compile_file (file_handle , type );
3272
3272
}
3273
3273
if (strstr (ZSTR_VAL (file_handle -> filename ), ".phar" ) && !strstr (ZSTR_VAL (file_handle -> filename ), "://" )) {
3274
- if (SUCCESS == phar_open_from_filename (ZSTR_VAL (file_handle -> filename ), ZSTR_LEN (file_handle -> filename ), NULL , 0 , 0 , & phar , NULL )) {
3274
+ if (SUCCESS == phar_open_from_filename (ZSTR_VAL (file_handle -> filename ), ZSTR_LEN (file_handle -> filename ), NULL , 0 , & phar , NULL )) {
3275
3275
if (phar -> is_zip || phar -> is_tar ) {
3276
3276
zend_file_handle f ;
3277
3277
@@ -3456,7 +3456,8 @@ void phar_request_initialize(void) /* {{{ */
3456
3456
if (!PHAR_G (request_init ))
3457
3457
{
3458
3458
PHAR_G (last_phar ) = NULL ;
3459
- PHAR_G (last_phar_name ) = PHAR_G (last_alias ) = NULL ;
3459
+ PHAR_G (last_phar_name ) = NULL ;
3460
+ PHAR_G (last_alias ) = NULL ;
3460
3461
PHAR_G (has_bz2 ) = zend_hash_str_exists (& module_registry , "bz2" , sizeof ("bz2" )- 1 );
3461
3462
PHAR_G (has_zlib ) = zend_hash_str_exists (& module_registry , "zlib" , sizeof ("zlib" )- 1 );
3462
3463
PHAR_G (request_init ) = 1 ;
0 commit comments