diff options
-rwxr-xr-x | ext/phar/phar_object.c | 14 | ||||
-rw-r--r-- | ext/phar/tests/pharfileinfo_construct.phpt | 54 |
2 files changed, 60 insertions, 8 deletions
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 6ce425e104..019bc1b692 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -3348,11 +3348,9 @@ PHP_METHOD(PharFileInfo, __construct) return; } - if (phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 2, 0 TSRMLS_CC) == FAILURE) { - efree(arch); - efree(entry); - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, - "Cannot access phar file entry '%s'", fname); + if (fname_len < 7 || memcmp(fname, "phar://", 7) || phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 2, 0 TSRMLS_CC) == FAILURE) { + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, + "'%s' is not a valid phar archive URL (must have at least phar://filename.phar)", fname); return; } @@ -3360,18 +3358,18 @@ PHP_METHOD(PharFileInfo, __construct) efree(arch); efree(entry); if (error) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot open phar file '%s': %s", fname, error); efree(error); } else { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot open phar file '%s'", fname); } return; } if ((entry_info = phar_get_entry_info_dir(phar_data, entry, entry_len, 1, &error TSRMLS_CC)) == NULL) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, + zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot access phar file entry '%s' in archive '%s'%s%s", entry, arch, error?", ":"", error?error:""); efree(arch); efree(entry); diff --git a/ext/phar/tests/pharfileinfo_construct.phpt b/ext/phar/tests/pharfileinfo_construct.phpt new file mode 100644 index 0000000000..e9aa3ac3d5 --- /dev/null +++ b/ext/phar/tests/pharfileinfo_construct.phpt @@ -0,0 +1,54 @@ +--TEST-- +Phar: PharFileInfo::__construct +--SKIPIF-- +<?php if (!extension_loaded("phar")) die("skip"); ?> +--INI-- +phar.readonly=0 +--FILE-- +<?php +$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar'; +$pname = 'phar://' . $fname; + +try { +file_put_contents($fname, 'blah'); +$a = new PharFileInfo($pname . '/oops'); +} catch (Exception $e) { +echo $e->getMessage() . "\n"; +unlink($fname); +} + +$a = new PharFileInfo(array()); + +$a = new Phar($fname); +$a['a'] = 'hi'; +$b = $a['a']; + +try { +$a = new PharFileInfo($pname . '/oops/I/do/not/exist'); +} catch (Exception $e) { +echo $e->getMessage() . "\n"; +} + +try { +$b->__construct('oops'); +} catch (Exception $e) { +echo $e->getMessage() . "\n"; +} + +try { +$a = new PharFileInfo(__FILE__); +} catch (Exception $e) { +echo $e->getMessage() . "\n"; +} +?> +===DONE=== +--CLEAN-- +<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?> +--EXPECTF-- +Cannot open phar file 'phar://%spharfileinfo_construct.phar/oops': internal corruption of phar "%spharfileinfo_construct.phar" (truncated entry) + +Warning: PharFileInfo::__construct() expects parameter 1 to be string, array given in %spharfileinfo_construct.php on line %d +Cannot access phar file entry '/oops/I/do/not/exist' in archive '%spharfileinfo_construct.phar' +Cannot call constructor twice +'%spharfileinfo_construct.php' is not a valid phar archive URL (must have at least phar://filename.phar) +===DONE===
\ No newline at end of file |