Browse Source

Fix bug #53914 (SPL assumes HAVE_GLOB is defined). Original patch by Chris

Jones; test updates by myself.
experimental/with_scalar_types
Adam Harvey 15 years ago
parent
commit
6bc25ca285
  1. 16
      ext/spl/spl_directory.c
  2. 3
      ext/spl/tests/dit_001.phpt
  3. 27
      ext/spl/tests/dit_001_noglob.phpt
  4. 2
      ext/spl/tests/dit_002.phpt

16
ext/spl/spl_directory.c

@ -163,11 +163,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;
}
@ -578,6 +580,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);
@ -585,6 +588,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);
@ -650,12 +654,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;
@ -1501,6 +1509,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)
@ -1527,6 +1536,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);
@ -1928,11 +1938,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) /* {{{ */
@ -2932,8 +2944,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);

3
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('.');

27
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===

2
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

Loading…
Cancel
Save