summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-02-11 15:50:53 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-02-11 15:50:53 +0100
commit2ca123e8f037f1c884dd56401ed966bf5b0f54b2 (patch)
tree5778441a9de9be593504b0d35f02ceba7f95e1fe
parent7a17be7f31be344605b244599f37b6f8579ec90b (diff)
parent4da67537c1bb5909e2f32c81534e316bff1af2f8 (diff)
downloadphp-git-2ca123e8f037f1c884dd56401ed966bf5b0f54b2.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
-rw-r--r--ext/spl/spl_directory.c19
-rw-r--r--ext/spl/tests/bug51068.phpt36
-rw-r--r--main/streams/glob_wrapper.c2
3 files changed, 51 insertions, 6 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 9f69ddba1e..6a7c43228e 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 b0ff40a7c5..f0c969a650 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;