diff options
author | Etienne Kneuss <colder@php.net> | 2011-09-08 15:52:59 +0000 |
---|---|---|
committer | Etienne Kneuss <colder@php.net> | 2011-09-08 15:52:59 +0000 |
commit | 3afb143e65060879fbd410895834b6ed1e720119 (patch) | |
tree | 326c52a2594f88b5fbfab7fb9af69dc4f7de7693 | |
parent | 9103c93606daec1af7997d7dcb9baeaaeb468b01 (diff) | |
download | php-git-3afb143e65060879fbd410895834b6ed1e720119.tar.gz |
SplFileObject does not accept directories. It did not check for that and blindly opened the directory, which works on linux but fails on windows. Now SplFileObject uses a stat() call to make sure it isn't a directory, if it is, it fails with an exception. Tests have been changed accordingly.
-rwxr-xr-x | ext/spl/spl_directory.c | 11 | ||||
-rw-r--r-- | ext/spl/tests/SplFileObject_fflush_basic_001.phpt | 5 | ||||
-rw-r--r-- | ext/spl/tests/SplFileObject_ftruncate_error_001.phpt | 3 | ||||
-rwxr-xr-x | ext/spl/tests/fileobject_003.phpt | 43 |
4 files changed, 35 insertions, 27 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 8870926942..55697a6a8c 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2223,6 +2223,7 @@ SPL_METHOD(SplFileObject, __construct) char *p1, *p2; char *tmp_path; int tmp_path_len; + zval tmp; zend_error_handling error_handling; zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling TSRMLS_CC); @@ -2244,6 +2245,16 @@ SPL_METHOD(SplFileObject, __construct) intern->u.file.open_mode = "r"; intern->u.file.open_mode_len = 1; } + + php_stat(intern->file_name, intern->file_name_len, FS_IS_DIR, &tmp TSRMLS_CC); + + if (Z_LVAL(tmp)) { + zend_restore_error_handling(&error_handling TSRMLS_CC); + intern->u.file.open_mode = NULL; + intern->file_name = NULL; + zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC, "Cannot use SplFileObject with directories"); + return; + } if (spl_filesystem_file_open(intern, use_include_path, 0 TSRMLS_CC) == SUCCESS) { tmp_path_len = strlen(intern->u.file.stream->orig_path); diff --git a/ext/spl/tests/SplFileObject_fflush_basic_001.phpt b/ext/spl/tests/SplFileObject_fflush_basic_001.phpt index baab156f68..2d8a9c8044 100644 --- a/ext/spl/tests/SplFileObject_fflush_basic_001.phpt +++ b/ext/spl/tests/SplFileObject_fflush_basic_001.phpt @@ -17,9 +17,12 @@ class VariableStream { var $varname; function stream_open($path, $mode, $options, &$opened_path) - { + { return true; } + + function url_stat() { + } } stream_wrapper_register("SPLtest", "VariableStream"); $ftruncate_test = ""; diff --git a/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt b/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt index 90b27ec416..a2eef604f1 100644 --- a/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt +++ b/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt @@ -12,6 +12,9 @@ class VariableStream { { return true; } + + function url_stat() { + } } stream_wrapper_register("SPLtest", "VariableStream"); $ftruncate_test = ""; diff --git a/ext/spl/tests/fileobject_003.phpt b/ext/spl/tests/fileobject_003.phpt index 6679673700..886bc7fab6 100755 --- a/ext/spl/tests/fileobject_003.phpt +++ b/ext/spl/tests/fileobject_003.phpt @@ -18,18 +18,21 @@ function test($name, $lc, $lp) var_dump($o == $c); var_dump($o->getPathname() == $c->getPathname()); - $f = new SplFileObject($name); - var_dump($name); - var_dump($f->getPathName()); - $l = substr($f->getPathName(), -1); - var_dump($l != '/' && $l != '\\' && $l == $lc); - var_dump($f->getFileName()); - $l = substr($f->getFileName(), -1); - var_dump($l != '/' && $l != '\\' && $l == $lc); - var_dump($f->getPath()); - $l = substr($f->getPath(), -1); - var_dump($l != '/' && $l != '\\' && $l == $lp); - + try { + $f = new SplFileObject($name); + var_dump($name); + var_dump($f->getPathName()); + $l = substr($f->getPathName(), -1); + var_dump($l != '/' && $l != '\\' && $l == $lc); + var_dump($f->getFileName()); + $l = substr($f->getFileName(), -1); + var_dump($l != '/' && $l != '\\' && $l == $lc); + var_dump($f->getPath()); + $l = substr($f->getPath(), -1); + var_dump($l != '/' && $l != '\\' && $l == $lp); + } catch (LogicException $e) { + echo "LogicException: ".$e->getMessage()."\n"; + } $fo = $o->openFile(); var_dump($fo->getPathName(), $fo->getFileName(), $fo->getPath()); } @@ -84,13 +87,7 @@ object(SplFileInfo)#%d (2) { bool(false) bool(true) bool(true) -%s(%d) "%stests/" -string(%d) "%stests" -bool(true) -string(5) "tests" -bool(true) -string(%d) "%sspl" -bool(true) +LogicException: Cannot use SplFileObject with directories string(%d) "%stests" string(%d) "tests" string(%d) "%sspl" @@ -110,13 +107,7 @@ object(SplFileInfo)#%d (2) { bool(false) bool(true) bool(true) -%s(%d) "%stests" -string(%d) "%stests" -bool(true) -string(%d) "tests" -bool(true) -string(%d) "%sspl" -bool(true) +LogicException: Cannot use SplFileObject with directories string(%d) "%stests" string(5) "tests" string(%d) "%sspl" |