Skip to content

Commit 839952c

Browse files
committed
ext/phar: Use HASH_FOREACH macro in phar_wrapper_rmdir()
Also simplify the inner if condition
1 parent d21bc7f commit 839952c

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

ext/phar/dirstream.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)