@@ -162,7 +162,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
162
162
{
163
163
phar_archive_data * phar ;
164
164
phar_entry_data * idata ;
165
- const char * internal_file ;
165
+ char * internal_file ;
166
166
char * error ;
167
167
HashTable * pharcontext ;
168
168
php_url * resource = NULL ;
@@ -189,7 +189,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
189
189
phar_request_initialize ();
190
190
191
191
/* strip leading "/" */
192
- internal_file = ZSTR_VAL (resource -> path ) + 1 ;
192
+ internal_file = estrndup ( ZSTR_VAL (resource -> path ) + 1 , ZSTR_LEN ( resource -> path ) - 1 ) ;
193
193
if (mode [0 ] == 'w' || (mode [0 ] == 'r' && mode [1 ] == '+' )) {
194
194
if (NULL == (idata = phar_get_or_create_entry_data (ZSTR_VAL (resource -> host ), ZSTR_LEN (resource -> host ), internal_file , strlen (internal_file ), mode , 0 , & error , 1 ))) {
195
195
if (error ) {
@@ -198,6 +198,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
198
198
} else {
199
199
php_stream_wrapper_log_error (wrapper , options , "phar error: file \"%s\" could not be created in phar \"%s\"" , internal_file , ZSTR_VAL (resource -> host ));
200
200
}
201
+ efree (internal_file );
201
202
php_url_free (resource );
202
203
return NULL ;
203
204
}
@@ -206,6 +207,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
206
207
}
207
208
fpf = php_stream_alloc (& phar_ops , idata , NULL , mode );
208
209
php_url_free (resource );
210
+ efree (internal_file );
209
211
210
212
if (context && Z_TYPE (context -> options ) != IS_UNDEF && (pzoption = zend_hash_str_find (HASH_OF (& context -> options ), "phar" , sizeof ("phar" )- 1 )) != NULL ) {
211
213
pharcontext = HASH_OF (pzoption );
@@ -235,13 +237,15 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
235
237
/* retrieve the stub */
236
238
if (FAILURE == phar_get_archive (& phar , ZSTR_VAL (resource -> host ), ZSTR_LEN (resource -> host ), NULL , 0 , NULL )) {
237
239
php_stream_wrapper_log_error (wrapper , options , "file %s is not a valid phar archive" , ZSTR_VAL (resource -> host ));
240
+ efree (internal_file );
238
241
php_url_free (resource );
239
242
return NULL ;
240
243
}
241
244
if (phar -> is_tar || phar -> is_zip ) {
242
245
if ((FAILURE == phar_get_entry_data (& idata , ZSTR_VAL (resource -> host ), ZSTR_LEN (resource -> host ), ".phar/stub.php" , sizeof (".phar/stub.php" )- 1 , "r" , 0 , & error , 0 )) || !idata ) {
243
246
goto idata_error ;
244
247
}
248
+ efree (internal_file );
245
249
if (opened_path ) {
246
250
* opened_path = strpprintf (MAXPATHLEN , "%s" , phar -> fname );
247
251
}
@@ -252,6 +256,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
252
256
if (stream == NULL ) {
253
257
if (UNEXPECTED (FAILURE == phar_open_archive_fp (phar ))) {
254
258
php_stream_wrapper_log_error (wrapper , options , "phar error: could not reopen phar \"%s\"" , ZSTR_VAL (resource -> host ));
259
+ efree (internal_file );
255
260
php_url_free (resource );
256
261
return NULL ;
257
262
}
@@ -280,6 +285,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
280
285
if (opened_path ) {
281
286
* opened_path = strpprintf (MAXPATHLEN , "%s" , phar -> fname );
282
287
}
288
+ efree (internal_file );
283
289
goto phar_stub ;
284
290
}
285
291
}
@@ -292,6 +298,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
292
298
} else {
293
299
php_stream_wrapper_log_error (wrapper , options , "phar error: \"%s\" is not a file in phar \"%s\"" , internal_file , ZSTR_VAL (resource -> host ));
294
300
}
301
+ efree (internal_file );
295
302
php_url_free (resource );
296
303
return NULL ;
297
304
}
@@ -310,6 +317,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
310
317
php_stream_wrapper_log_error (wrapper , options , "%s" , error );
311
318
efree (error );
312
319
phar_entry_delref (idata );
320
+ efree (internal_file );
313
321
return NULL ;
314
322
}
315
323
@@ -332,6 +340,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
332
340
if (opened_path ) {
333
341
* opened_path = zend_strpprintf_unchecked (MAXPATHLEN , "phar://%s/%S" , idata -> phar -> fname , idata -> internal_file -> filename );
334
342
}
343
+ efree (internal_file );
335
344
phar_stub :
336
345
fpf = php_stream_alloc (& phar_ops , idata , NULL , mode );
337
346
return fpf ;
@@ -653,8 +662,7 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
653
662
static int phar_wrapper_unlink (php_stream_wrapper * wrapper , const char * url , int options , php_stream_context * context ) /* {{{ */
654
663
{
655
664
php_url * resource ;
656
- const char * internal_file ;
657
- char * error ;
665
+ char * internal_file , * error ;
658
666
int internal_file_len ;
659
667
phar_entry_data * idata ;
660
668
phar_archive_data * pphar ;
@@ -687,7 +695,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
687
695
}
688
696
689
697
/* need to copy to strip leading "/", will get touched again */
690
- internal_file = ZSTR_VAL (resource -> path ) + 1 ;
698
+ internal_file = estrndup ( ZSTR_VAL (resource -> path ) + 1 , ZSTR_LEN ( resource -> path ) - 1 ) ;
691
699
internal_file_len = ZSTR_LEN (resource -> path ) - 1 ;
692
700
if (FAILURE == phar_get_entry_data (& idata , ZSTR_VAL (resource -> host ), ZSTR_LEN (resource -> host ), internal_file , internal_file_len , "r" , 0 , & error , 1 )) {
693
701
/* constraints of fp refcount were not met */
@@ -697,6 +705,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
697
705
} else {
698
706
php_stream_wrapper_log_error (wrapper , options , "unlink of \"%s\" failed, file does not exist" , url );
699
707
}
708
+ efree (internal_file );
700
709
php_url_free (resource );
701
710
return 0 ;
702
711
}
@@ -706,11 +715,13 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
706
715
if (idata -> internal_file -> fp_refcount > 1 ) {
707
716
/* more than just our fp resource is open for this file */
708
717
php_stream_wrapper_log_error (wrapper , options , "phar error: \"%s\" in phar \"%s\", has open file pointers, cannot unlink" , internal_file , ZSTR_VAL (resource -> host ));
718
+ efree (internal_file );
709
719
php_url_free (resource );
710
720
phar_entry_delref (idata );
711
721
return 0 ;
712
722
}
713
723
php_url_free (resource );
724
+ efree (internal_file );
714
725
phar_entry_remove (idata , & error );
715
726
if (error ) {
716
727
php_stream_wrapper_log_error (wrapper , options , "%s" , error );
0 commit comments