]> granicus.if.org Git - php/commitdiff
- improve r316420 (SplFileObject cannot and should not accept directories)
authorPierre Joye <pajoye@php.net>
Thu, 8 Sep 2011 23:07:48 +0000 (23:07 +0000)
committerPierre Joye <pajoye@php.net>
Thu, 8 Sep 2011 23:07:48 +0000 (23:07 +0000)
ext/spl/spl_directory.c
ext/spl/tests/fileobject_003.phpt

index 55697a6a8cbde7d3a8abc9b9d6ec90e992b59f73..209d2aeb07fb456c4ab1d4178578c91717ae7951 100755 (executable)
@@ -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);
 
@@ -2255,7 +2266,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);
 
index 886bc7fab60297b184dd5d97427aca99168165cf..6cc650b7b5fd78d944a37ba7dc8e8548c2c01cd4 100755 (executable)
@@ -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===