summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-02-11 15:50:33 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-02-11 15:50:47 +0100
commit4da67537c1bb5909e2f32c81534e316bff1af2f8 (patch)
tree4e0b51fcc43ca55b823f906d3a6f086d361c331c
parentbe64a06b1cf37a560384ee568498f870e77be168 (diff)
parentec28d4c247ef3c7ab9af41ff6e26b802694492b2 (diff)
downloadphp-git-4da67537c1bb5909e2f32c81534e316bff1af2f8.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
-rw-r--r--NEWS4
-rw-r--r--ext/spl/spl_directory.c19
-rw-r--r--ext/spl/tests/bug51068.phpt36
-rw-r--r--main/streams/glob_wrapper.c2
4 files changed, 55 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index d3f1d7ebd8..8f3e10e09a 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,10 @@ PHP NEWS
- phpdbg:
. Fixed bug #76596 (phpdbg support for display_errors=stderr). (kabel)
+- SPL:
+ . Fixed bug #51068 (DirectoryIterator glob:// don't support current path
+ relative queries). (Ahmed Abdou)
+
- Standard:
. Fixed bug #77552 (Unintialized php_stream_statbuf in stat functions).
(John Stevenson)
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index a057b22c08..0f0da14c15 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -212,12 +212,21 @@ static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *in
}
break;
case SPL_FS_DIR:
- if (intern->file_name) {
- efree(intern->file_name);
+ {
+ size_t path_len = 0;
+ char *path = spl_filesystem_object_get_path(intern, &path_len);
+ if (intern->file_name) {
+ efree(intern->file_name);
+ }
+ /* if there is parent path, ammend it, otherwise just use the given path as is */
+ if (path_len == 0) {
+ intern->file_name_len = spprintf(
+ &intern->file_name, 0, "%s", intern->u.dir.entry.d_name);
+ } else {
+ intern->file_name_len = spprintf(
+ &intern->file_name, 0, "%s%c%s", path, slash, intern->u.dir.entry.d_name);
+ }
}
- intern->file_name_len = spprintf(&intern->file_name, 0, "%s%c%s",
- spl_filesystem_object_get_path(intern, NULL),
- slash, intern->u.dir.entry.d_name);
break;
}
} /* }}} */
diff --git a/ext/spl/tests/bug51068.phpt b/ext/spl/tests/bug51068.phpt
new file mode 100644
index 0000000000..0263536cc3
--- /dev/null
+++ b/ext/spl/tests/bug51068.phpt
@@ -0,0 +1,36 @@
+--TEST--
+SPL: glob wrapper interactions with DirectoryIterator
+--FILE--
+<?php
+touch('bug.51068');
+mkdir('bug.51068.dir');
+touch('bug.51068.dir/lvl2.bug.51068');
+$iter = new DirectoryIterator('glob://*.51068');
+foreach ($iter as $f) {
+ var_dump($f->getFilename());
+ var_dump($f->getSize());
+}
+$iter = new DirectoryIterator('glob://bug.51068.dir/*.51068');
+foreach ($iter as $f) {
+ var_dump($f->getFilename());
+ var_dump($f->getSize());
+}
+$iter = new DirectoryIterator('glob://bug.51068.dir');
+foreach ($iter as $f) {
+ var_dump($f->getFilename());
+ var_dump($f->getSize() >= 0);
+}
+?>
+--CLEAN--
+<?php
+unlink('bug.51068');
+unlink('bug.51068.dir/lvl2.bug.51068');
+rmdir('bug.51068.dir');
+?>
+--EXPECT--
+string(9) "bug.51068"
+int(0)
+string(14) "lvl2.bug.51068"
+int(0)
+string(13) "bug.51068.dir"
+bool(true)
diff --git a/main/streams/glob_wrapper.c b/main/streams/glob_wrapper.c
index dfe6e534ba..dcdbabf185 100644
--- a/main/streams/glob_wrapper.c
+++ b/main/streams/glob_wrapper.c
@@ -126,7 +126,7 @@ static void php_glob_stream_path_split(glob_s_t *pglob, const char *path, int ge
if (pglob->path) {
efree(pglob->path);
}
- if (path != gpath) {
+ if ((path - gpath) > 1) {
path--;
}
pglob->path_len = path - gpath;