summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Harvey <aharvey@php.net>2011-02-04 10:49:49 +0000
committerAdam Harvey <aharvey@php.net>2011-02-04 10:49:49 +0000
commita7d4b80ca2e24b0240c52d5e8cb3d36ef9c7f8c0 (patch)
tree012bc52fe8a9d1f39587ad74356f9cccdb1509a3
parent521e5462abb6eb7036b39f337f2be55849f6e90d (diff)
downloadphp-git-a7d4b80ca2e24b0240c52d5e8cb3d36ef9c7f8c0.tar.gz
Fix bug #53914 (SPL assumes HAVE_GLOB is defined). Original patch by Chris
Jones; test updates by myself.
-rw-r--r--NEWS1
-rwxr-xr-xext/spl/spl_directory.c16
-rwxr-xr-xext/spl/tests/dit_001.phpt3
-rw-r--r--ext/spl/tests/dit_001_noglob.phpt27
-rwxr-xr-xext/spl/tests/dit_002.phpt2
5 files changed, 47 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 880be94442..ae2051fdc1 100644
--- a/NEWS
+++ b/NEWS
@@ -130,6 +130,7 @@
(Mateusz Kocielski, Pierre)
- SPL extension:
+ . Fixed bug #53914 (SPL assumes HAVE_GLOB is defined). (Chris Jones)
. Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
values). (Felipe)
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 0585ddc23a..04c2c114b2 100755
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -164,11 +164,13 @@ static zend_object_value spl_filesystem_object_new(zend_class_entry *class_type
PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *len TSRMLS_DC) /* {{{ */
{
+#ifdef HAVE_GLOB
if (intern->type == SPL_FS_DIR) {
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
return php_glob_stream_get_path(intern->u.dir.dirp, 0, len);
}
}
+#endif
if (len) {
*len = intern->_path_len;
}
@@ -575,6 +577,7 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
efree(pnstr);
}
if (intern->type == SPL_FS_DIR) {
+#ifdef HAVE_GLOB
pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator, "glob", sizeof("glob")-1, &pnlen TSRMLS_CC);
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->_path, intern->_path_len, 1);
@@ -582,6 +585,7 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
add_assoc_bool_ex(&zrv, pnstr, pnlen+1, 0);
}
efree(pnstr);
+#endif
pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1, &pnlen TSRMLS_CC);
if (intern->u.dir.sub_path) {
add_assoc_stringl_ex(&zrv, pnstr, pnlen+1, intern->u.dir.sub_path, intern->u.dir.sub_path_len, 1);
@@ -647,12 +651,16 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, long ctor_fla
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
intern->flags = flags;
+#ifdef HAVE_GLOB
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && strstr(path, "glob://") != path) {
spprintf(&path, 0, "glob://%s", path);
spl_filesystem_dir_open(intern, path TSRMLS_CC);
efree(path);
- } else {
+ } else
+#endif
+ {
spl_filesystem_dir_open(intern, path TSRMLS_CC);
+
}
intern->u.dir.is_recursive = instanceof_function(intern->std.ce, spl_ce_RecursiveDirectoryIterator TSRMLS_CC) ? 1 : 0;
@@ -1439,6 +1447,7 @@ SPL_METHOD(RecursiveDirectoryIterator, __construct)
}
/* }}} */
+#ifdef HAVE_GLOB
/* {{{ proto int GlobIterator::__construct(string path [, int flags])
Cronstructs a new dir iterator from a glob expression (no glob:// needed). */
SPL_METHOD(GlobIterator, __construct)
@@ -1465,6 +1474,7 @@ SPL_METHOD(GlobIterator, count)
}
}
/* }}} */
+#endif /* HAVE_GLOB */
/* {{{ forward declarations to the iterator handlers */
static void spl_filesystem_dir_it_dtor(zend_object_iterator *iter TSRMLS_DC);
@@ -1864,11 +1874,13 @@ static const zend_function_entry spl_RecursiveDirectoryIterator_functions[] = {
{NULL, NULL, NULL}
};
+#ifdef HAVE_GLOB
static const zend_function_entry spl_GlobIterator_functions[] = {
SPL_ME(GlobIterator, __construct, arginfo_r_dir___construct, ZEND_ACC_PUBLIC)
SPL_ME(GlobIterator, count, arginfo_splfileinfo_void, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
+#endif
/* }}} */
static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent TSRMLS_DC) /* {{{ */
@@ -2824,8 +2836,10 @@ PHP_MINIT_FUNCTION(spl_directory)
REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, spl_RecursiveDirectoryIterator_functions);
REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator);
+#ifdef HAVE_GLOB
REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new, spl_GlobIterator_functions);
REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable);
+#endif
REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new, spl_SplFileObject_functions);
REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator);
diff --git a/ext/spl/tests/dit_001.phpt b/ext/spl/tests/dit_001.phpt
index 2b0e50e194..a56166def0 100755
--- a/ext/spl/tests/dit_001.phpt
+++ b/ext/spl/tests/dit_001.phpt
@@ -1,5 +1,8 @@
--TEST--
SPL: Problem with casting to string
+--SKIPIF--
+<?php
+if (!defined('GLOB_ERR')) print "skip";
--FILE--
<?php
$d = new DirectoryIterator('.');
diff --git a/ext/spl/tests/dit_001_noglob.phpt b/ext/spl/tests/dit_001_noglob.phpt
new file mode 100644
index 0000000000..acb2092a55
--- /dev/null
+++ b/ext/spl/tests/dit_001_noglob.phpt
@@ -0,0 +1,27 @@
+--TEST--
+SPL: Problem with casting to string (no glob version)
+--SKIPIF--
+<?php
+if (defined('GLOB_ERR')) print "skip";
+--FILE--
+<?php
+$d = new DirectoryIterator('.');
+var_dump($d);
+var_dump(is_string($d));
+preg_match('/x/', $d);
+var_dump(is_string($d));
+?>
+===DONE===
+--EXPECTF--
+object(DirectoryIterator)#%d (3) {
+ %s"pathName"%s"SplFileInfo":private]=>
+ %s(%d) ".%c%s"
+ %s"fileName"%s"SplFileInfo":private]=>
+ %s(%d) "%s"
+ %s"subPathName"%s"RecursiveDirectoryIterator":private]=>
+ %s(0) ""
+}
+bool(false)
+bool(false)
+===DONE===
+
diff --git a/ext/spl/tests/dit_002.phpt b/ext/spl/tests/dit_002.phpt
index 5e825a1fe3..a2665421e0 100755
--- a/ext/spl/tests/dit_002.phpt
+++ b/ext/spl/tests/dit_002.phpt
@@ -1,7 +1,7 @@
--TEST--
SPL: DirectoryIterator defaults
--SKIPIF--
-<?php if (!extension_loaded("spl") || !extension_loaded('reflection')) print "skip"; ?>
+<?php if (!extension_loaded("spl") || !extension_loaded('reflection') || !defined('GLOB_ERR')) print "skip"; ?>
--FILE--
<?php