]> granicus.if.org Git - php/commitdiff
SplFileObject does not accept directories. It did not check for that and blindly...
authorEtienne Kneuss <colder@php.net>
Thu, 8 Sep 2011 15:52:59 +0000 (15:52 +0000)
committerEtienne Kneuss <colder@php.net>
Thu, 8 Sep 2011 15:52:59 +0000 (15:52 +0000)
ext/spl/spl_directory.c
ext/spl/tests/SplFileObject_fflush_basic_001.phpt
ext/spl/tests/SplFileObject_ftruncate_error_001.phpt
ext/spl/tests/fileobject_003.phpt

index 8870926942752b673523bdaf0fc7a1fa17de6883..55697a6a8cbde7d3a8abc9b9d6ec90e992b59f73 100755 (executable)
@@ -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);
index baab156f68987ff9bedf62afb1a96909f4941185..2d8a9c80444c181eca7cd21ff85e3d93c8aaecb1 100644 (file)
@@ -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 = "";
index 90b27ec4162c46a420624c239c426480da03b608..a2eef604f19d2f9c47d8a210c33702ed7589e80c 100644 (file)
@@ -12,6 +12,9 @@ class VariableStream {
     {
         return true;
     }
+
+    function url_stat() {
+    }
 }
 stream_wrapper_register("SPLtest", "VariableStream");
 $ftruncate_test = "";
index 66796737003540bad11547df437e3ff449a7eb7b..886bc7fab60297b184dd5d97427aca99168165cf 100755 (executable)
@@ -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"