Skip to content

Commit 784e4bc

Browse files
committed
fix GH-12661 (Inconsistency in ZipArchive::addGlob remove_path Option Behavior)
1 parent c5184a9 commit 784e4bc

File tree

8 files changed

+34
-7
lines changed

8 files changed

+34
-7
lines changed

package.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
</stability>
2828
<license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
2929
<notes>
30-
-
30+
- fix GH-12661 (Inconsistency in ZipArchive::addGlob 'remove_path' Option Behavior)
3131
</notes>
3232
<contents>
3333
<dir name="/">

php5/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
19741974
php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0,
19751975
&basename, (size_t *)&file_stripped_len TSRMLS_CC);
19761976
file_stripped = basename;
1977-
} else if (opts.remove_path && strstr(Z_STRVAL_PP(zval_file), opts.remove_path) != NULL) {
1977+
} else if (opts.remove_path && !memcmp(Z_STRVAL_PP(zval_file), opts.remove_path, opts.remove_path_len)) {
19781978
if (IS_SLASH(Z_STRVAL_PP(zval_file)[opts.remove_path_len])) {
19791979
file_stripped = Z_STRVAL_PP(zval_file) + opts.remove_path_len + 1;
19801980
file_stripped_len = Z_STRLEN_PP(zval_file) - opts.remove_path_len - 1;

php7/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1880,7 +1880,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
18801880
basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
18811881
file_stripped = ZSTR_VAL(basename);
18821882
file_stripped_len = ZSTR_LEN(basename);
1883-
} else if (opts.remove_path && strstr(Z_STRVAL_P(zval_file), opts.remove_path) != NULL) {
1883+
} else if (opts.remove_path && !memcmp(Z_STRVAL_P(zval_file), opts.remove_path, opts.remove_path_len)) {
18841884
if (IS_SLASH(Z_STRVAL_P(zval_file)[opts.remove_path_len])) {
18851885
file_stripped = Z_STRVAL_P(zval_file) + opts.remove_path_len + 1;
18861886
file_stripped_len = Z_STRLEN_P(zval_file) - opts.remove_path_len - 1;

php73/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
18831883
basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
18841884
file_stripped = ZSTR_VAL(basename);
18851885
file_stripped_len = ZSTR_LEN(basename);
1886-
} else if (opts.remove_path && strstr(Z_STRVAL_P(zval_file), opts.remove_path) != NULL) {
1886+
} else if (opts.remove_path && !memcmp(Z_STRVAL_P(zval_file), opts.remove_path, opts.remove_path_len)) {
18871887
if (IS_SLASH(Z_STRVAL_P(zval_file)[opts.remove_path_len])) {
18881888
file_stripped = Z_STRVAL_P(zval_file) + opts.remove_path_len + 1;
18891889
file_stripped_len = Z_STRLEN_P(zval_file) - opts.remove_path_len - 1;

php74/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1868,7 +1868,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
18681868
basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
18691869
file_stripped = ZSTR_VAL(basename);
18701870
file_stripped_len = ZSTR_LEN(basename);
1871-
} else if (opts.remove_path && strstr(Z_STRVAL_P(zval_file), opts.remove_path) != NULL) {
1871+
} else if (opts.remove_path && !memcmp(Z_STRVAL_P(zval_file), opts.remove_path, opts.remove_path_len)) {
18721872
if (IS_SLASH(Z_STRVAL_P(zval_file)[opts.remove_path_len])) {
18731873
file_stripped = Z_STRVAL_P(zval_file) + opts.remove_path_len + 1;
18741874
file_stripped_len = Z_STRLEN_P(zval_file) - opts.remove_path_len - 1;

php8/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1768,7 +1768,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
17681768
basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
17691769
file_stripped = ZSTR_VAL(basename);
17701770
file_stripped_len = ZSTR_LEN(basename);
1771-
} else if (opts.remove_path && strstr(Z_STRVAL_P(zval_file), opts.remove_path) != NULL) {
1771+
} else if (opts.remove_path && !memcmp(Z_STRVAL_P(zval_file), opts.remove_path, opts.remove_path_len)) {
17721772
if (IS_SLASH(Z_STRVAL_P(zval_file)[opts.remove_path_len])) {
17731773
file_stripped = Z_STRVAL_P(zval_file) + opts.remove_path_len + 1;
17741774
file_stripped_len = Z_STRLEN_P(zval_file) - opts.remove_path_len - 1;

php81/php_zip.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1783,7 +1783,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
17831783
basename = php_basename(Z_STRVAL_P(zval_file), Z_STRLEN_P(zval_file), NULL, 0);
17841784
file_stripped = ZSTR_VAL(basename);
17851785
file_stripped_len = ZSTR_LEN(basename);
1786-
} else if (opts.remove_path && strstr(Z_STRVAL_P(zval_file), opts.remove_path) != NULL) {
1786+
} else if (opts.remove_path && !memcmp(Z_STRVAL_P(zval_file), opts.remove_path, opts.remove_path_len)) {
17871787
if (IS_SLASH(Z_STRVAL_P(zval_file)[opts.remove_path_len])) {
17881788
file_stripped = Z_STRVAL_P(zval_file) + opts.remove_path_len + 1;
17891789
file_stripped_len = Z_STRLEN_P(zval_file) - opts.remove_path_len - 1;

tests/bug_gh12661.phpt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Bug GH-12661 (Inconsistency in ZipArchive::addGlob 'remove_path' Option Behavior)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded('zip')) die('skip zip extension not available');
6+
?>
7+
--FILE--
8+
<?php
9+
include __DIR__ . '/utils.inc';
10+
11+
touch($file = __DIR__ . '/bug_gh12661.zip');
12+
13+
$zip = new ZipArchive();
14+
$zip->open($file, ZipArchive::CREATE | ZipArchive::OVERWRITE);
15+
$zip->addGlob(__FILE__, 0, ['remove_path' => 'bug_']); // unchanged (bug is not a prefix)
16+
$zip->addGlob(__FILE__, 0, ['remove_path' => dirname(__DIR__)]);
17+
verify_entries($zip, [__FILE__, 'tests/' . basename(__FILE__)]);
18+
$zip->close();
19+
20+
?>
21+
Done
22+
--CLEAN--
23+
<?php
24+
unlink(__DIR__ . '/bug_gh12661.zip');
25+
?>
26+
--EXPECT--
27+
Done

0 commit comments

Comments
 (0)