diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-11 15:50:33 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-11 15:50:47 +0100 |
commit | 4da67537c1bb5909e2f32c81534e316bff1af2f8 (patch) | |
tree | 4e0b51fcc43ca55b823f906d3a6f086d361c331c | |
parent | be64a06b1cf37a560384ee568498f870e77be168 (diff) | |
parent | ec28d4c247ef3c7ab9af41ff6e26b802694492b2 (diff) | |
download | php-git-4da67537c1bb5909e2f32c81534e316bff1af2f8.tar.gz |
Merge branch 'PHP-7.2' into PHP-7.3
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/spl/spl_directory.c | 19 | ||||
-rw-r--r-- | ext/spl/tests/bug51068.phpt | 36 | ||||
-rw-r--r-- | main/streams/glob_wrapper.c | 2 |
4 files changed, 55 insertions, 6 deletions
@@ -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; |