From 218561bf763705b667d338004cfd714ff4dba73b Mon Sep 17 00:00:00 2001 From: "M. Vondano" Date: Fri, 24 Jun 2022 19:25:51 +0200 Subject: [PATCH] Fix GH-8861: correctly handle string lengths in \SplFileinfo::getBasename --- ext/spl/spl_directory.c | 4 +-- .../tests/SplFileinfo_getBasename_basic.phpt | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 ext/spl/tests/SplFileinfo_getBasename_basic.phpt diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 766828ef80204..ed54eb7d1897d 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1038,8 +1038,8 @@ PHP_METHOD(SplFileInfo, getBasename) path = spl_filesystem_object_get_path(intern); if (path && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) { - fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1; - flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1); + fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path); + flen = ZSTR_LEN(intern->file_name) - ZSTR_LEN(path); } else { fname = ZSTR_VAL(intern->file_name); flen = ZSTR_LEN(intern->file_name); diff --git a/ext/spl/tests/SplFileinfo_getBasename_basic.phpt b/ext/spl/tests/SplFileinfo_getBasename_basic.phpt new file mode 100644 index 0000000000000..554a3856b9f92 --- /dev/null +++ b/ext/spl/tests/SplFileinfo_getBasename_basic.phpt @@ -0,0 +1,32 @@ +--TEST-- +SPL: SplFileInfo::getBasename() basic test +--FILE-- +getBasename() . PHP_EOL; +echo (new \SplFileInfo('path/to/b'))->getBasename() . PHP_EOL; +echo (new \SplFileInfo('c.txt'))->getBasename() . PHP_EOL; +echo (new \SplFileInfo('d'))->getBasename() . PHP_EOL; +echo (new \SplFileInfo('~/path/to//e'))->getBasename() . PHP_EOL . PHP_EOL; + +// with $suffix +echo (new \SplFileInfo('path/to/a.txt'))->getBasename('.txt') . PHP_EOL; +echo (new \SplFileInfo('path/to/bbb.txt'))->getBasename('b.txt') . PHP_EOL; +echo (new \SplFileInfo('path/to/ccc.txt'))->getBasename('to/ccc.txt') . PHP_EOL; +echo (new \SplFileInfo('d.txt'))->getBasename('txt') . PHP_EOL; +echo (new \SplFileInfo('e.txt'))->getBasename('e.txt') . PHP_EOL; +echo (new \SplFileInfo('f'))->getBasename('.txt'); +?> +--EXPECT-- +a.txt +b +c.txt +d +e + +a +bb +ccc.txt +d. +e.txt +f