diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index db70f4cc71e7d..34da571a89bf6 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -4275,7 +4275,7 @@ static int phar_extract_file(zend_bool overwrite, phar_entry_info *entry, char * return FAILURE; } - if (!phar_get_efp(entry, 0)) { + if ((phar_get_fp_type(entry) == PHAR_FP && (entry->flags & PHAR_ENT_COMPRESSION_MASK)) || !phar_get_efp(entry, 0)) { if (FAILURE == phar_open_entry_fp(entry, error, 1)) { if (error) { spprintf(error, 4096, "Cannot extract \"%s\" to \"%s\", unable to open internal file pointer: %s", entry->filename, fullpath, *error); diff --git a/ext/phar/tests/bug69279.phpt b/ext/phar/tests/bug69279.phpt new file mode 100644 index 0000000000000..6aeac12d3b9f6 --- /dev/null +++ b/ext/phar/tests/bug69279.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #69279 (Compressed ZIP Phar extractTo() creates garbage files) +--SKIPIF-- + +--INI-- +phar.readonly=0 +--FILE-- +compressFiles(Phar::GZ); +unset($w); + +$r = new Phar(__DIR__ . "/bug69279.phar.zip"); +var_dump($r["bug69279.txt"]->isCompressed()); + +$r->extractTo(__DIR__, NULL, TRUE); +var_dump(file_get_contents(__DIR__ . "/bug69279.txt")); +?> +--EXPECT-- +bool(true) +string(15) "Sample content." +--CLEAN-- + diff --git a/ext/phar/tests/bug69279a.phpt b/ext/phar/tests/bug69279a.phpt new file mode 100644 index 0000000000000..4a9db45238f76 --- /dev/null +++ b/ext/phar/tests/bug69279a.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #69279 (Compressed ZIP Phar extractTo() creates garbage files) +--SKIPIF-- + +--FILE-- +extractTo(__DIR__ . '/bug69279a', null, true)); +var_dump(strncmp(file_get_contents(__DIR__ . '/bug69279a/1.txt'), 'Lorem ipsum', 11)); +var_dump(strncmp(file_get_contents(__DIR__ . '/bug69279a/2.txt'), 'foo', 3)); +var_dump(strncmp(file_get_contents(__DIR__ . '/bug69279a/3.txt'), 'Lorem ipsum', 11)); +?> +--EXPECT-- +bool(true) +int(0) +int(0) +int(0) +--CLEAN-- + +--INI-- +phar.readonly=0 +--FILE-- +addFromString("test.txt", "This is a test file.This is a test file.This is a test file."); +$file = $phar["test.txt"]; +var_dump($file->compress(Phar::GZ)); //true (success) +var_dump($file->getContent()); +var_dump($file->isCompressed()); //true (the file is compressed) +var_dump($phar->decompressFiles()); //true (success) +var_dump($file->isCompressed()); //false (the file should not be compressed anymore) +var_dump($phar->extractTo(__DIR__ . "/bug79912")); //true +var_dump(file_get_contents(__DIR__ . "/bug79912/test.txt")); //the extracted file in the folder should be decompressed +?> +--EXPECT-- +bool(true) +string(60) "This is a test file.This is a test file.This is a test file." +bool(true) +bool(true) +bool(false) +bool(true) +string(60) "This is a test file.This is a test file.This is a test file." +--CLEAN-- +