From b97b4056453e5232491e0acec0fbbae1d26a3cde Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 13 Dec 2025 10:20:58 +0000 Subject: [PATCH 1/2] Fix GH-20678: resource created by GlobIterator crashes with fclose(). --- ext/spl/spl_directory.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 0a4d1456d65e9..16bb6a11e5218 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -306,6 +306,11 @@ static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_string * intern->type = SPL_FS_DIR; intern->u.dir.dirp = php_stream_opendir(ZSTR_VAL(path), REPORT_ERRORS, FG(default_context)); + if (intern->u.dir.dirp) { + /* we prevent potential UAF with conflicting explicit fclose(), relying on the object destructor for this */ + intern->u.dir.dirp->flags |= PHP_STREAM_FLAG_NO_FCLOSE; + } + if (ZSTR_LEN(path) > 1 && IS_SLASH_AT(ZSTR_VAL(path), ZSTR_LEN(path)-1)) { intern->path = zend_string_init(ZSTR_VAL(path), ZSTR_LEN(path)-1, 0); } else { From dc09366b280fde57c7090ec5f81ce240b488b412 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 13 Dec 2025 11:54:38 +0000 Subject: [PATCH 2/2] add test --- ext/spl/tests/gh20678.phpt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ext/spl/tests/gh20678.phpt diff --git a/ext/spl/tests/gh20678.phpt b/ext/spl/tests/gh20678.phpt new file mode 100644 index 0000000000000..243f8cef06d16 --- /dev/null +++ b/ext/spl/tests/gh20678.phpt @@ -0,0 +1,14 @@ +--TEST-- +GH-20678 (resource created by GlobalIterator crashes when it is called with fclose()) +--CREDITS-- +chongwick +--FILE-- + +--EXPECTF-- + +Warning: fclose(): %d is not a valid stream resource in %s on line %d