From: Greg Beaver Date: Sat, 30 Aug 2008 23:47:55 +0000 (+0000) Subject: sync with pecl/phar, this does not change any functionality in PHP 5.3, but makes... X-Git-Tag: BEFORE_NS_RULES_CHANGE~527 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ebb94f6a20e4df51e753e135113d0951b4e4a27;p=php sync with pecl/phar, this does not change any functionality in PHP 5.3, but makes syncing easier. This commit is only functional changes, WS will be next --- diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index e72bd5b2d2..8270cba80f 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -569,8 +569,8 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_ int arch_len, entry_len; php_url *resource = NULL; uint host_len; - int key_type; - char *key; + phar_zstr key; + char *str_key; uint key_len; ulong unused; uint path_len; @@ -640,9 +640,11 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_ } for (zend_hash_internal_pointer_reset(&phar->manifest); - HASH_KEY_NON_EXISTANT != (key_type = zend_hash_get_current_key_ex(&phar->manifest, &key, &key_len, &unused, 0, NULL)); + HASH_KEY_NON_EXISTANT != zend_hash_get_current_key_ex(&phar->manifest, &key, &key_len, &unused, 0, NULL); zend_hash_move_forward(&phar->manifest)) { + PHAR_STR(key, str_key); + if (!entry->is_deleted && key_len > path_len && memcmp(key, resource->path+1, path_len) == 0 && @@ -658,13 +660,15 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_ } for (zend_hash_internal_pointer_reset(&phar->virtual_dirs); - HASH_KEY_NON_EXISTANT != (key_type = zend_hash_get_current_key_ex(&phar->virtual_dirs, &key, &key_len, &unused, 0, NULL)); + HASH_KEY_NON_EXISTANT != zend_hash_get_current_key_ex(&phar->virtual_dirs, &key, &key_len, &unused, 0, NULL); zend_hash_move_forward(&phar->virtual_dirs)) { + PHAR_STR(key, str_key); + if (!entry->is_deleted && key_len > path_len && - memcmp(key, resource->path+1, path_len) == 0 && - IS_SLASH(key[path_len])) { + memcmp(str_key, resource->path+1, path_len) == 0 && + IS_SLASH(str_key[path_len])) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: Directory not empty"); if (entry->is_temp_dir) { efree(entry->filename); diff --git a/ext/phar/phar.phar b/ext/phar/phar.phar index 09088ef30c..2ee3026cc1 100755 Binary files a/ext/phar/phar.phar and b/ext/phar/phar.phar differ diff --git a/ext/phar/stream.c b/ext/phar/stream.c index b432790d65..729847ca2f 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -886,7 +886,8 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char /* Rename directory. Update all nested paths */ if (is_dir) { int key_type; - char *key, *new_key; + phar_zstr key, new_key; + char *str_key, *new_str_key; uint key_len, new_key_len; ulong unused; uint from_len = strlen(resource_from->path+1); @@ -897,22 +898,31 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char SUCCESS == zend_hash_get_current_data(&phar->manifest, (void **) &entry); zend_hash_move_forward(&phar->manifest)) { + PHAR_STR(key, str_key); + if (!entry->is_deleted && key_len > from_len && - memcmp(key, resource_from->path+1, from_len) == 0 && - IS_SLASH(key[from_len])) { + memcmp(str_key, resource_from->path+1, from_len) == 0 && + IS_SLASH(str_key[from_len])) { new_key_len = key_len + to_len - from_len; - new_key = emalloc(new_key_len+1); - memcpy(new_key, resource_to->path + 1, to_len); - memcpy(new_key + to_len, key + from_len, key_len - from_len); - new_key[new_key_len] = 0; + new_str_key = emalloc(new_key_len+1); + memcpy(new_str_key, resource_to->path + 1, to_len); + memcpy(new_str_key + to_len, str_key + from_len, key_len - from_len); + new_str_key[new_key_len] = 0; is_modified = 1; entry->is_modified = 1; efree(entry->filename); - entry->filename = new_key; + entry->filename = new_str_key; entry->filename_len = new_key_len; + + PHAR_ZSTR(new_str_key, new_key); + +#if PHP_VERSION_ID < 50300 + zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, NULL); +#else zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); +#endif } } @@ -920,17 +930,25 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char HASH_KEY_NON_EXISTANT != (key_type = zend_hash_get_current_key_ex(&phar->virtual_dirs, &key, &key_len, &unused, 0, NULL)); zend_hash_move_forward(&phar->virtual_dirs)) { + PHAR_STR(key, str_key); + if (key_len >= from_len && - memcmp(key, resource_from->path+1, from_len) == 0 && - (key_len == from_len || IS_SLASH(key[from_len]))) { + memcmp(str_key, resource_from->path+1, from_len) == 0 && + (key_len == from_len || IS_SLASH(str_key[from_len]))) { new_key_len = key_len + to_len - from_len; - new_key = emalloc(new_key_len+1); - memcpy(new_key, resource_to->path + 1, to_len); - memcpy(new_key + to_len, key + from_len, key_len - from_len); - new_key[new_key_len] = 0; + new_str_key = emalloc(new_key_len+1); + memcpy(new_str_key, resource_to->path + 1, to_len); + memcpy(new_str_key + to_len, str_key + from_len, key_len - from_len); + new_str_key[new_key_len] = 0; + + PHAR_ZSTR(new_str_key, new_key); +#if PHP_VERSION_ID < 50300 + zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, NULL); +#else zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); - efree(new_key); +#endif + efree(new_str_key); } } @@ -939,17 +957,25 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char SUCCESS == zend_hash_get_current_data(&phar->mounted_dirs, (void **) &entry); zend_hash_move_forward(&phar->mounted_dirs)) { + PHAR_STR(key, str_key); + if (key_len >= from_len && - memcmp(key, resource_from->path+1, from_len) == 0 && - (key_len == from_len || IS_SLASH(key[from_len]))) { + memcmp(str_key, resource_from->path+1, from_len) == 0 && + (key_len == from_len || IS_SLASH(str_key[from_len]))) { new_key_len = key_len + to_len - from_len; - new_key = emalloc(new_key_len+1); - memcpy(new_key, resource_to->path + 1, to_len); - memcpy(new_key + to_len, key + from_len, key_len - from_len); - new_key[new_key_len] = 0; + new_str_key = emalloc(new_key_len+1); + memcpy(new_str_key, resource_to->path + 1, to_len); + memcpy(new_str_key + to_len, str_key + from_len, key_len - from_len); + new_str_key[new_key_len] = 0; + + PHAR_ZSTR(new_str_key, new_key); +#if PHP_VERSION_ID < 50300 + zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, NULL); +#else zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); - efree(new_key); +#endif + efree(new_str_key); } } }