@@ -150,10 +150,9 @@ static int phar_compare_dir_name(Bucket *f, Bucket *s) /* {{{ */
150
150
* files in a phar and retrieving its relative path. From this, construct
151
151
* a list of files/directories that are "in" the directory represented by dir
152
152
*/
153
- static php_stream * phar_make_dirstream (char * dir , const HashTable * manifest ) /* {{{ */
153
+ static php_stream * phar_make_dirstream (const char * dir , size_t dirlen , const HashTable * manifest ) /* {{{ */
154
154
{
155
155
HashTable * data ;
156
- size_t dirlen = strlen (dir );
157
156
char * entry ;
158
157
159
158
ALLOC_HASHTABLE (data );
@@ -162,7 +161,6 @@ static php_stream *phar_make_dirstream(char *dir, const HashTable *manifest) /*
162
161
if ((* dir == '/' && dirlen == 1 && (manifest -> nNumOfElements == 0 )) || (dirlen >= sizeof (".phar" )- 1 && !memcmp (dir , ".phar" , sizeof (".phar" )- 1 ))) {
163
162
/* make empty root directory for empty phar */
164
163
/* make empty directory for .phar magic directory */
165
- efree (dir );
166
164
return php_stream_alloc (& phar_dir_ops , data , NULL , "r" );
167
165
}
168
166
@@ -240,11 +238,9 @@ static php_stream *phar_make_dirstream(char *dir, const HashTable *manifest) /*
240
238
} ZEND_HASH_FOREACH_END ();
241
239
242
240
if (FAILURE != zend_hash_has_more_elements (data )) {
243
- efree (dir );
244
241
zend_hash_sort (data , phar_compare_dir_name , 0 );
245
242
return php_stream_alloc (& phar_dir_ops , data , NULL , "r" );
246
243
} else {
247
- efree (dir );
248
244
return php_stream_alloc (& phar_dir_ops , data , NULL , "r" );
249
245
}
250
246
}
@@ -256,10 +252,8 @@ static php_stream *phar_make_dirstream(char *dir, const HashTable *manifest) /*
256
252
php_stream * phar_wrapper_open_dir (php_stream_wrapper * wrapper , const char * path , const char * mode , int options , zend_string * * opened_path , php_stream_context * context STREAMS_DC ) /* {{{ */
257
253
{
258
254
php_url * resource = NULL ;
259
- php_stream * ret ;
260
- char * internal_file , * error ;
255
+ char * error ;
261
256
phar_archive_data * phar ;
262
- phar_entry_info * entry = NULL ;
263
257
264
258
if ((resource = phar_parse_url (wrapper , path , mode , options )) == NULL ) {
265
259
php_stream_wrapper_log_error (wrapper , options , "phar url \"%s\" is unknown" , path );
@@ -285,7 +279,6 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
285
279
}
286
280
287
281
phar_request_initialize ();
288
- internal_file = ZSTR_VAL (resource -> path ) + 1 ; /* strip leading "/" */
289
282
290
283
if (FAILURE == phar_get_archive (& phar , ZSTR_VAL (resource -> host ), ZSTR_LEN (resource -> host ), NULL , 0 , & error )) {
291
284
if (error ) {
@@ -302,41 +295,44 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
302
295
efree (error );
303
296
}
304
297
305
- if (* internal_file == '\0' ) {
298
+ if (zend_string_equals ( resource -> path , ZSTR_CHAR ( '/' )) ) {
306
299
/* root directory requested */
307
- internal_file = estrndup (internal_file - 1 , 1 );
308
- ret = phar_make_dirstream (internal_file , & phar -> manifest );
309
300
php_url_free (resource );
310
- return ret ;
301
+ return phar_make_dirstream ( "/" , strlen ( "/" ), & phar -> manifest ) ;
311
302
}
312
303
313
304
if (!HT_IS_INITIALIZED (& phar -> manifest )) {
314
305
php_url_free (resource );
315
306
return NULL ;
316
307
}
317
308
318
- size_t internal_file_len = strlen (internal_file );
319
- if (NULL != (entry = zend_hash_str_find_ptr (& phar -> manifest , internal_file , internal_file_len )) && !entry -> is_dir ) {
309
+ const char * internal_file = ZSTR_VAL (resource -> path ) + 1 ; /* strip leading "/" */
310
+ size_t internal_file_len = ZSTR_LEN (resource -> path ) - 1 ;
311
+ phar_entry_info * entry = zend_hash_str_find_ptr (& phar -> manifest , internal_file , internal_file_len );
312
+ php_stream * ret ;
313
+
314
+ if (NULL != entry && !entry -> is_dir ) {
320
315
php_url_free (resource );
321
316
return NULL ;
322
317
} else if (entry && entry -> is_dir ) {
323
318
if (entry -> is_mounted ) {
319
+ ret = php_stream_opendir (entry -> tmp , options , context );
324
320
php_url_free (resource );
325
- return php_stream_opendir ( entry -> tmp , options , context ) ;
321
+ return ret ;
326
322
}
327
- internal_file = estrdup (internal_file );
323
+ ret = phar_make_dirstream (internal_file , internal_file_len , & phar -> manifest );
328
324
php_url_free (resource );
329
- return phar_make_dirstream ( internal_file , & phar -> manifest ) ;
325
+ return ret ;
330
326
} else {
331
327
zend_string * str_key ;
332
328
333
329
/* search for directory */
334
330
ZEND_HASH_MAP_FOREACH_STR_KEY (& phar -> manifest , str_key ) {
335
331
if (zend_string_starts_with_cstr (str_key , internal_file , internal_file_len )) {
336
332
/* directory found */
337
- internal_file = estrndup (internal_file , internal_file_len );
333
+ ret = phar_make_dirstream (internal_file , internal_file_len , & phar -> manifest );
338
334
php_url_free (resource );
339
- return phar_make_dirstream ( internal_file , & phar -> manifest ) ;
335
+ return ret ;
340
336
}
341
337
} ZEND_HASH_FOREACH_END ();
342
338
}
0 commit comments