summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatoliy Belsky <ab@php.net>2012-04-19 11:20:16 +0200
committerAnatoliy Belsky <ab@php.net>2012-04-19 11:33:12 +0200
commitadfb4c62b76ef241978814e10cae70498f52ea29 (patch)
treeda06e71a293fd7cf6988a360215888e9aafc8ecf
parent4650b2164b641ba3fd9d733e8cc82e386aa98772 (diff)
downloadphp-git-adfb4c62b76ef241978814e10cae70498f52ea29.tar.gz
Fix bug 61671 ext\spl\tests\fileobject_003.phpt fails
The solution was already introduced in 5.4 by Etienne Kneuss and Pierre but wasn't merged back into 5.3 . SplFileObject should not be used with directories. So just putting together all the necessary pieces from 5.4
-rwxr-xr-xext/spl/spl_directory.c11
-rw-r--r--ext/spl/tests/SplFileObject_fflush_basic_001.phpt5
-rw-r--r--ext/spl/tests/SplFileObject_ftruncate_error_001.phpt3
-rwxr-xr-xext/spl/tests/fileobject_003.phpt59
4 files changed, 43 insertions, 35 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 04da4e6afe..aaa256de7b 100755
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -271,7 +271,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 FAILURE;
+ }
+
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) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, intern->u.file.context);
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..6cc650b7b5 100755
--- a/ext/spl/tests/fileobject_003.phpt
+++ b/ext/spl/tests/fileobject_003.phpt
@@ -18,20 +18,27 @@ 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);
-
- $fo = $o->openFile();
- var_dump($fo->getPathName(), $fo->getFileName(), $fo->getPath());
+ 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";
+ }
+ 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));
@@ -84,16 +91,8 @@ 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)
-string(%d) "%stests"
-string(%d) "tests"
-string(%d) "%sspl"
+LogicException: Cannot use SplFileObject with directories
+LogicException: Cannot use SplFileObject with directories
===2===
object(SplFileInfo)#%d (2) {
["pathName":"SplFileInfo":private]=>
@@ -110,14 +109,6 @@ 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)
-string(%d) "%stests"
-string(5) "tests"
-string(%d) "%sspl"
+LogicException: Cannot use SplFileObject with directories
+LogicException: Cannot use SplFileObject with directories
===DONE===