Skip to content

Commit 4d44271

Browse files
committed
Fix #81490: ZipArchive::extractTo() may leak memory
We always need to free the CWD state. Closes GH-7536.
1 parent 23e13e2 commit 4d44271

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ PHP NEWS
3232
. Fixed bug #70962 (XML_OPTION_SKIP_WHITE strips embedded whitespace).
3333
(Aliaksandr Bystry, cmb)
3434

35+
- Zip:
36+
. Fixed bug #81490 (ZipArchive::extractTo() may leak memory). (cmb, Remi)
37+
3538
23 Sep 2021, PHP 7.4.24
3639

3740
- Core:

ext/zip/php_zip.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,13 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, size_t
161161
virtual_file_ex(&new_state, file, NULL, CWD_EXPAND);
162162
path_cleaned = php_zip_make_relative_path(new_state.cwd, new_state.cwd_length);
163163
if(!path_cleaned) {
164+
CWD_STATE_FREE(new_state.cwd);
164165
return 0;
165166
}
166167
path_cleaned_len = strlen(path_cleaned);
167168

168169
if (path_cleaned_len >= MAXPATHLEN || zip_stat(za, file, 0, &sb) != 0) {
170+
CWD_STATE_FREE(new_state.cwd);
169171
return 0;
170172
}
171173

@@ -200,8 +202,8 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, size_t
200202
efree(file_dirname_fullpath);
201203
if (!is_dir_only) {
202204
zend_string_release_ex(file_basename, 0);
203-
CWD_STATE_FREE(new_state.cwd);
204205
}
206+
CWD_STATE_FREE(new_state.cwd);
205207
return 0;
206208
}
207209
}

ext/zip/tests/bug81490.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Bug #81490 (ZipArchive::extractTo() may leak memory)
3+
--SKIPIF--
4+
<?php
5+
if (!extension_loaded("zip")) die("skip zip extension not available");
6+
?>
7+
--FILE--
8+
<?php
9+
$zip = new ZipArchive();
10+
$zip->open(__DIR__ . "/bug81490.zip", ZipArchive::CREATE|ZipArchive::OVERWRITE);
11+
$zip->addFromString("", "yada yada");
12+
mkdir(__DIR__ . "/bug81490");
13+
$zip->open(__DIR__ . "/bug81490.zip");
14+
$zip->extractTo(__DIR__ . "/bug81490", "");
15+
?>
16+
--EXPECT--
17+
--CLEAN--
18+
<?php
19+
@unlink(__DIR__ . "/bug81490.zip");
20+
@rmdir(__DIR__ . "/bug81490");
21+
?>

0 commit comments

Comments
 (0)