From 1c3097fcbe5ea2460333b44c963a8bdb9d5459ed Mon Sep 17 00:00:00 2001 From: Greg Beaver Date: Thu, 10 Apr 2008 03:12:08 +0000 Subject: [PATCH] make built-in SplFileInfo->isWriteable() work for PharFileInfo as well, by ensuring phar->is_writeable is set/reset when phar.readonly is changed --- ext/phar/phar.c | 20 +++++++++- ext/phar/tests/phar_oo_iswriteable.phpt | 53 +++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 ext/phar/tests/phar_oo_iswriteable.phpt diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 806a6cfc92..0694f04a77 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -26,6 +26,21 @@ ZEND_DECLARE_MODULE_GLOBALS(phar) +/** + * set's phar->is_writeable based on the current INI value + */ +static int phar_set_writeable_bit(void *pDest, void *argument TSRMLS_DC) /* {{{ */ +{ + zend_bool keep = *(zend_bool *)argument; + phar_archive_data *phar = *(phar_archive_data **)pDest; + + if (!phar->is_data) { + phar->is_writeable = !keep; + } + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + /* if the original value is 0 (disabled), then allow setting/unsetting at will otherwise, only allow 1 (enabled), and error on disabling */ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */ @@ -63,7 +78,10 @@ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */ } if (entry->name_length == 14) { - PHAR_G(readonly) = ini; + PHAR_G(readonly) = ini; + if (PHAR_GLOBALS->request_init && PHAR_GLOBALS->phar_fname_map.arBuckets) { + zend_hash_apply_with_argument(&(PHAR_GLOBALS->phar_fname_map), phar_set_writeable_bit, (void *)&ini TSRMLS_CC); + } } else { PHAR_G(require_hash) = ini; } diff --git a/ext/phar/tests/phar_oo_iswriteable.phpt b/ext/phar/tests/phar_oo_iswriteable.phpt new file mode 100644 index 0000000000..9957cea867 --- /dev/null +++ b/ext/phar/tests/phar_oo_iswriteable.phpt @@ -0,0 +1,53 @@ +--TEST-- +Phar::isWriteable +--SKIPIF-- + +--INI-- +phar.readonly=0 +phar.require_hash=0 +--FILE-- +'; + +$files = array(); +$files['a.php'] = ''; +$files['dir/'] = ''; +$hasdir = 1; +include 'files/phar_test.inc'; +$a = new Phar($fname); +var_dump($a['a.php']->isWritable()); +var_dump($a['a.php']->isReadable()); +$a['a.php']->chmod(000); +var_dump($a['a.php']->isWritable()); +var_dump($a['a.php']->isReadable()); +$a['a.php']->chmod(0666); +var_dump($a['a.php']->isWritable()); +var_dump($a['a.php']->isReadable()); +ini_set('phar.readonly',1); +clearstatcache(); +var_dump($a['a.php']->isWritable()); +var_dump($a['a.php']->isReadable()); +ini_set('phar.readonly',0); +clearstatcache(); +var_dump($a['a.php']->isWritable()); +var_dump($a['a.php']->isReadable()); +?> +===DONE=== +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +bool(false) +bool(false) +bool(true) +bool(true) +bool(false) +bool(true) +bool(true) +bool(true) +===DONE=== -- 2.50.1