diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 0127fed901c..abc83348f1c 100755 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -251,7 +251,18 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TS static int spl_filesystem_file_open(spl_filesystem_object *intern, int use_include_path, int silent TSRMLS_DC) /* {{{ */ { + zval tmp; + intern->type = SPL_FS_FILE; + + php_stat(intern->file_name, intern->file_name_len, FS_IS_DIR, &tmp TSRMLS_CC); + if (Z_LVAL(tmp)) { + 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; + } + intern->u.file.context = php_stream_context_from_zval(intern->u.file.zcontext, 0); intern->u.file.stream = php_stream_open_wrapper_ex(intern->file_name, intern->u.file.open_mode, (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, intern->u.file.context); @@ -2254,7 +2265,7 @@ SPL_METHOD(SplFileObject, __construct) 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/fileobject_003.phpt b/ext/spl/tests/fileobject_003.phpt index 886bc7fab60..6cc650b7b5f 100755 --- a/ext/spl/tests/fileobject_003.phpt +++ b/ext/spl/tests/fileobject_003.phpt @@ -33,8 +33,12 @@ function test($name, $lc, $lp) } catch (LogicException $e) { echo "LogicException: ".$e->getMessage()."\n"; } - $fo = $o->openFile(); - var_dump($fo->getPathName(), $fo->getFileName(), $fo->getPath()); + try { + $fo = $o->openFile(); + var_dump($fo->getPathName(), $fo->getFileName(), $fo->getPath()); + } catch (LogicException $e) { + echo "LogicException: ".$e->getMessage()."\n"; + } } test(dirname(__FILE__) . '/' . 'fileobject_001a.txt', 't', substr(dirname(__FILE__),-1)); @@ -88,9 +92,7 @@ bool(false) bool(true) bool(true) LogicException: Cannot use SplFileObject with directories -string(%d) "%stests" -string(%d) "tests" -string(%d) "%sspl" +LogicException: Cannot use SplFileObject with directories ===2=== object(SplFileInfo)#%d (2) { ["pathName":"SplFileInfo":private]=> @@ -108,7 +110,5 @@ bool(false) bool(true) bool(true) LogicException: Cannot use SplFileObject with directories -string(%d) "%stests" -string(5) "tests" -string(%d) "%sspl" +LogicException: Cannot use SplFileObject with directories ===DONE===