]> granicus.if.org Git - php/commitdiff
Fix bug #72321 - use efree() for emalloc allocation
authorStanislav Malyshev <stas@php.net>
Sun, 12 Jun 2016 23:43:12 +0000 (16:43 -0700)
committerStanislav Malyshev <stas@php.net>
Mon, 13 Jun 2016 04:35:13 +0000 (21:35 -0700)
ext/phar/phar_object.c
ext/phar/tests/72321_1.zip [new file with mode: 0644]
ext/phar/tests/72321_2.zip [new file with mode: 0644]
ext/phar/tests/bug72321.phpt [new file with mode: 0644]

index 08d29831e07dd93ef3a0292fed0be3b780b4b187..64d7a6c76eee2f07e4ecb5b3934ed89615239364 100644 (file)
@@ -4217,14 +4217,14 @@ static int phar_extract_file(zend_bool overwrite, phar_entry_info *entry, char *
                        if (!php_stream_mkdir(fullpath, entry->flags & PHAR_ENT_PERM_MASK,  PHP_STREAM_MKDIR_RECURSIVE, NULL)) {
                                spprintf(error, 4096, "Cannot extract \"%s\", could not create directory \"%s\"", entry->filename, fullpath);
                                efree(fullpath);
-                               free(new_state.cwd);
+                               efree(new_state.cwd);
                                return FAILURE;
                        }
                } else {
                        if (!php_stream_mkdir(fullpath, 0777,  PHP_STREAM_MKDIR_RECURSIVE, NULL)) {
                                spprintf(error, 4096, "Cannot extract \"%s\", could not create directory \"%s\"", entry->filename, fullpath);
                                efree(fullpath);
-                               free(new_state.cwd);
+                               efree(new_state.cwd);
                                return FAILURE;
                        }
                }
diff --git a/ext/phar/tests/72321_1.zip b/ext/phar/tests/72321_1.zip
new file mode 100644 (file)
index 0000000..ebc44ea
Binary files /dev/null and b/ext/phar/tests/72321_1.zip differ
diff --git a/ext/phar/tests/72321_2.zip b/ext/phar/tests/72321_2.zip
new file mode 100644 (file)
index 0000000..de7ca26
Binary files /dev/null and b/ext/phar/tests/72321_2.zip differ
diff --git a/ext/phar/tests/bug72321.phpt b/ext/phar/tests/bug72321.phpt
new file mode 100644 (file)
index 0000000..37aca19
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+Phar: PHP bug #72321: invalid free in phar_extract_file()
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--FILE--
+<?php
+chdir(__DIR__);
+mkdir("test72321");
+$phar = new PharData("72321_1.zip");
+$phar->extractTo("test72321");
+$phar = new PharData("72321_2.zip");
+try {
+$phar->extractTo("test72321");
+} catch(PharException $e) {
+       print $e->getMessage()."\n";
+}
+?>
+DONE
+--CLEAN--
+<?php unlink(__DIR__."/test72321/AAAAAAAAxxxxBBBBCCCCCCCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+rmdir(__DIR__."/test72321");
+?>
+--EXPECTF--
+Warning: PharData::extractTo(): Not a directory in %s/bug72321.php on line %d
+Extraction from phar "%s/72321_2.zip" failed: Cannot extract "AAAAAAAAxxxxBBBBCCCCCCCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/b/c", could not create directory "test72321/AAAAAAAAxxxxBBBBCCCCCCCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/b"
+DONE
\ No newline at end of file