diff options
author | Stanislav Malyshev <stas@php.net> | 2015-09-28 15:51:59 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2015-09-28 15:56:51 -0700 |
commit | d698f0ae51f67c9cce870b09c59df3d6ba959244 (patch) | |
tree | 35321eeb989a5c33b13ed5671a0cc3c6b379bed8 | |
parent | bb98ed600ab6787d9d367927d49439be9a83441e (diff) | |
download | php-git-d698f0ae51f67c9cce870b09c59df3d6ba959244.tar.gz |
Fix bug #69720: Null pointer dereference in phar_get_fp_offset()
-rw-r--r-- | ext/phar/tests/bug69720.phar | bin | 0 -> 8192 bytes | |||
-rw-r--r-- | ext/phar/tests/bug69720.phpt | 40 | ||||
-rw-r--r-- | ext/phar/util.c | 6 |
3 files changed, 45 insertions, 1 deletions
diff --git a/ext/phar/tests/bug69720.phar b/ext/phar/tests/bug69720.phar Binary files differnew file mode 100644 index 0000000000..f62fb11280 --- /dev/null +++ b/ext/phar/tests/bug69720.phar diff --git a/ext/phar/tests/bug69720.phpt b/ext/phar/tests/bug69720.phpt new file mode 100644 index 0000000000..43b701d014 --- /dev/null +++ b/ext/phar/tests/bug69720.phpt @@ -0,0 +1,40 @@ +--TEST-- +Phar - bug #69720 - Null pointer dereference in phar_get_fp_offset() +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--FILE-- +<?php +try { + // open an existing phar + $p = new Phar(__DIR__."/bug69720.phar",0); + // Phar extends SPL's DirectoryIterator class + echo $p->getMetadata(); + foreach (new RecursiveIteratorIterator($p) as $file) { + // $file is a PharFileInfo class, and inherits from SplFileInfo + $temp=""; + $temp= $file->getFileName() . "\n"; + $temp.=file_get_contents($file->getPathName()) . "\n"; // display contents + var_dump($file->getMetadata()); + } +} + catch (Exception $e) { + echo 'Could not open Phar: ', $e; +} +?> +--EXPECTF-- + +MY_METADATA_NULL + +Warning: file_get_contents(phar:///%s): failed to open stream: phar error: "test.php" is not a file in phar "%s.phar" in %s.php on line %d +array(1) { + ["whatever"]=> + int(123) +} +object(DateTime)#2 (3) { + ["date"]=> + string(26) "2000-01-01 00:00:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(3) "UTC" +} diff --git a/ext/phar/util.c b/ext/phar/util.c index 2c41adf92a..69da7b9b89 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -494,7 +494,11 @@ really_get_entry: (*ret)->is_tar = entry->is_tar; (*ret)->fp = phar_get_efp(entry, 1 TSRMLS_CC); if (entry->link) { - (*ret)->zero = phar_get_fp_offset(phar_get_link_source(entry TSRMLS_CC) TSRMLS_CC); + phar_entry_info *link = phar_get_link_source(entry TSRMLS_CC); + if(!link) { + return FAILURE; + } + (*ret)->zero = phar_get_fp_offset(link TSRMLS_CC); } else { (*ret)->zero = phar_get_fp_offset(entry TSRMLS_CC); } |