Skip to content

Commit 50b4caf

Browse files
zghostsnikic
authored andcommitted
Fixed bugs #71317 and #71504
If there are duplicate filenames in tar, the last one wins.
1 parent d78220f commit 50b4caf

File tree

5 files changed

+73
-1
lines changed

5 files changed

+73
-1
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ PHP NEWS
1717
- Phar:
1818
. Fixed bug #71625 (Crash in php7.dll with bad phar filename).
1919
(Anatol)
20+
. Fixed bug #71504 (Parsing of tar file with duplicate filenames causes
21+
memory leak). (Jos Elstgeest)
2022

2123
03 Mar 2016, PHP 5.6.19
2224

ext/phar/tar.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,9 @@ int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias,
500500
entry.link = estrndup(hdr->linkname, linkname_len);
501501
}
502502
phar_set_inode(&entry TSRMLS_CC);
503-
zend_hash_add(&myphar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), (void **) &newentry);
503+
504+
zend_hash_update(&myphar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), (void **) &newentry);
505+
ZEND_ASSERT(newentry != NULL);
504506

505507
if (entry.is_persistent) {
506508
++entry.manifest_pos;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
--TEST--
2+
Bug #71317: regression in opening tar based phar files
3+
--SKIPIF--
4+
<?php if (!extension_loaded('phar')) die('skip'); ?>
5+
<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
6+
<?php if (!extension_loaded("zlib")) die("skip zlib not available"); ?>
7+
--FILE--
8+
<?php
9+
include dirname(__FILE__) . '/files/tarmaker.php.inc';
10+
11+
$testDirectory = __DIR__ . '/files/test_bug71317';
12+
$testTarFilename = __DIR__ . '/files/test_bug71317.tar';
13+
14+
$tar = new tarmaker($testTarFilename, 'none');
15+
$tar->init();
16+
$tar->addFile('file1.txt', 'file1');
17+
$tar->addFile('file2.txt', 'file2');
18+
$tar->addFile('file3.txt', 'file3');
19+
$tar->addFile('file4.txt', 'file4');
20+
$tar->addFile('file5.txt', 'file5');
21+
$tar->addFile('file2.txt', 'file2a');
22+
$tar->close();
23+
24+
$fname = str_replace('\\', '/', $testTarFilename);
25+
try {
26+
mkdir($testDirectory);
27+
$tar = new PharData($fname);
28+
$tar->extractTo($testDirectory);
29+
30+
$fileContent = file_get_contents($testDirectory . '/file2.txt');
31+
$expectedContent = 'file2a';
32+
if ($fileContent !== $expectedContent) {
33+
throw new Exception(sprintf('Contents of file2.txt ("%s") is invalid, expected "%s"', $fileContent, $expectedContent));
34+
}
35+
} catch(Exception $e) {
36+
echo $e->getMessage() . "\n";
37+
}
38+
?>
39+
===DONE===
40+
--CLEAN--
41+
<?php
42+
$testDirectory = __DIR__ . '/files/test_bug71317';
43+
$testTarFilename = __DIR__ . '/files/test_bug71317.tar';
44+
45+
unlink($testTarFilename);
46+
array_map('unlink', glob($testDirectory . "/*.txt"));
47+
rmdir($testDirectory);
48+
?>
49+
--EXPECT--
50+
===DONE===

ext/phar/tests/tar/bug71504.phpt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Bug #71504: Parsing of tar file with duplicate filenames causes memory leak
3+
--SKIPIF--
4+
<?php if (!extension_loaded('phar')) die('skip'); ?>
5+
<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
6+
<?php if (!extension_loaded("zlib")) die("skip zlib not available"); ?>
7+
--FILE--
8+
<?php
9+
$fname = str_replace('\\', '/', dirname(__FILE__) . '/files/HTML_CSS-1.5.4.tgz');
10+
try {
11+
$tar = new PharData($fname);
12+
} catch(Exception $e) {
13+
echo $e->getMessage() . "\n";
14+
}
15+
?>
16+
===DONE===
17+
--EXPECT--
18+
===DONE===
44.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)