Skip to content

Commit

Permalink
fix bug #67761
Browse files Browse the repository at this point in the history
Phar::mapPhar fails for Phars inside a path containing ".tar".

Strengthen the silly .tar file extension check.
  • Loading branch information
m6w6 committed Mar 30, 2015
1 parent f4264eb commit 8f7e378
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
4 changes: 3 additions & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,10 @@ PHP NEWS
. Add a check for RAND_egd to allow compiling against LibreSSL (Leigh)

- Phar:
. Fixed bug 64343 (PharData::extractTo fails for tarball created by BSD tar).
. Fixed bug #64343 (PharData::extractTo fails for tarball created by BSD tar).
(Mike)
. Fixed bug #67761 (Phar::mapPhar fails for Phars inside a path containing
".tar"). (Mike)

- Postgres:
. Fixed bug #68741 (Null pointer dereference) (CVE-2015-1352). (Laruence)
Expand Down
7 changes: 5 additions & 2 deletions ext/phar/tar.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ int phar_is_tar(char *buf, char *fname) /* {{{ */
tar_header *header = (tar_header *) buf;
php_uint32 checksum = phar_tar_number(header->checksum, sizeof(header->checksum));
php_uint32 ret;
char save[sizeof(header->checksum)];
char save[sizeof(header->checksum)], *bname;

/* assume that the first filename in a tar won't begin with <?php */
if (!strncmp(buf, "<?php", sizeof("<?php")-1)) {
Expand All @@ -113,7 +113,10 @@ int phar_is_tar(char *buf, char *fname) /* {{{ */
memset(header->checksum, ' ', sizeof(header->checksum));
ret = (checksum == phar_tar_checksum(buf, 512));
memcpy(header->checksum, save, sizeof(header->checksum));
if (!ret && strstr(fname, ".tar")) {
if ((bname = strrchr(fname, PHP_DIR_SEPARATOR))) {
fname = bname;
}
if (!ret && (bname = strstr(fname, ".tar")) && (bname[4] == '\0' || bname[4] == '.')) {
/* probably a corrupted tar - so we will pretend it is one */
return 1;
}
Expand Down
19 changes: 19 additions & 0 deletions ext/phar/tests/tar/bug67761.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--TEST--
Bug #67761 (Phar::mapPhar fails for Phars inside a path containing ".tar")
--SKIPIF--
<?php extension_loaded("phar") or die("SKIP need ext/phar suppport"); ?>
--FILE--
<?php

echo "Test\n";

include __DIR__."/files/bug67761.tar/bug67761.phar";

?>

===DONE===
--EXPECT--
Test
#!/usr/bin/env php
Test
===DONE===
Binary file not shown.

0 comments on commit 8f7e378

Please sign in to comment.