@@ -531,8 +531,6 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
531531 char * error , * arch , * entry2 ;
532532 size_t arch_len , entry_len ;
533533 php_url * resource = NULL ;
534- zend_string * str_key ;
535- zend_ulong unused ;
536534
537535 /* pre-readonly check, we need to know if this is a data phar */
538536 if (FAILURE == phar_split_fname (url , strlen (url ), & arch , & arch_len , & entry2 , & entry_len , 2 , 2 )) {
@@ -592,13 +590,13 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
592590 }
593591
594592 if (!entry -> is_deleted ) {
595- for ( zend_hash_internal_pointer_reset ( & phar -> manifest ) ;
596- HASH_KEY_NON_EXISTENT != zend_hash_get_current_key ( & phar -> manifest , & str_key , & unused );
597- zend_hash_move_forward (& phar -> manifest )
598- ) {
599- if ( ZSTR_LEN ( str_key ) > path_len &&
600- memcmp (ZSTR_VAL (str_key ), ZSTR_VAL ( resource -> path ) + 1 , path_len ) == 0 &&
601- IS_SLASH ( ZSTR_VAL ( str_key )[ path_len ]) ) {
593+ zend_string * str_key ;
594+
595+ ZEND_HASH_MAP_FOREACH_STR_KEY (& phar -> manifest , str_key ) {
596+ if (
597+ zend_string_starts_with_cstr ( str_key , ZSTR_VAL ( resource -> path ) + 1 , path_len )
598+ && IS_SLASH (ZSTR_VAL (str_key )[ path_len ])
599+ ) {
602600 php_stream_wrapper_log_error (wrapper , options , "phar error: Directory not empty" );
603601 if (entry -> is_temp_dir ) {
604602 efree (entry -> filename );
@@ -607,15 +605,14 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
607605 php_url_free (resource );
608606 return 0 ;
609607 }
610- }
611-
612- for (zend_hash_internal_pointer_reset (& phar -> virtual_dirs );
613- HASH_KEY_NON_EXISTENT != zend_hash_get_current_key (& phar -> virtual_dirs , & str_key , & unused );
614- zend_hash_move_forward (& phar -> virtual_dirs )) {
615-
616- if (ZSTR_LEN (str_key ) > path_len &&
617- memcmp (ZSTR_VAL (str_key ), ZSTR_VAL (resource -> path )+ 1 , path_len ) == 0 &&
618- IS_SLASH (ZSTR_VAL (str_key )[path_len ])) {
608+ } ZEND_HASH_FOREACH_END ();
609+
610+ ZEND_HASH_MAP_FOREACH_STR_KEY (& phar -> virtual_dirs , str_key ) {
611+ ZEND_ASSERT (str_key );
612+ if (
613+ zend_string_starts_with_cstr (str_key , ZSTR_VAL (resource -> path )+ 1 , path_len )
614+ && IS_SLASH (ZSTR_VAL (str_key )[path_len ])
615+ ) {
619616 php_stream_wrapper_log_error (wrapper , options , "phar error: Directory not empty" );
620617 if (entry -> is_temp_dir ) {
621618 efree (entry -> filename );
@@ -624,7 +621,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
624621 php_url_free (resource );
625622 return 0 ;
626623 }
627- }
624+ } ZEND_HASH_FOREACH_END ();
628625 }
629626
630627 if (entry -> is_temp_dir ) {
0 commit comments