@@ -291,8 +291,6 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
291291 php_url * resource = NULL ;
292292 php_stream * ret ;
293293 char * internal_file , * error ;
294- zend_string * str_key ;
295- zend_ulong unused ;
296294 phar_archive_data * phar ;
297295 phar_entry_info * entry = NULL ;
298296
@@ -363,25 +361,18 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
363361 return phar_make_dirstream (internal_file , & phar -> manifest );
364362 } else {
365363 size_t i_len = strlen (internal_file );
364+ zend_string * str_key ;
366365
367366 /* search for directory */
368- zend_hash_internal_pointer_reset (& phar -> manifest );
369- while (FAILURE != zend_hash_has_more_elements (& phar -> manifest )) {
370- if (HASH_KEY_NON_EXISTENT !=
371- zend_hash_get_current_key (& phar -> manifest , & str_key , & unused )) {
372- if (ZSTR_LEN (str_key ) > i_len && 0 == memcmp (ZSTR_VAL (str_key ), internal_file , i_len )) {
373- /* directory found */
374- internal_file = estrndup (internal_file ,
375- i_len );
376- php_url_free (resource );
377- return phar_make_dirstream (internal_file , & phar -> manifest );
378- }
379- }
380-
381- if (SUCCESS != zend_hash_move_forward (& phar -> manifest )) {
382- break ;
367+ ZEND_HASH_MAP_FOREACH_STR_KEY (& phar -> manifest , str_key ) {
368+ if (zend_string_starts_with_cstr (str_key , internal_file , i_len )) {
369+ /* directory found */
370+ internal_file = estrndup (internal_file ,
371+ i_len );
372+ php_url_free (resource );
373+ return phar_make_dirstream (internal_file , & phar -> manifest );
383374 }
384- }
375+ } ZEND_HASH_FOREACH_END ();
385376 }
386377
387378 php_url_free (resource );
0 commit comments