[php-src] master: Merge branch 'PHP-8.5'
Ilia Alshanetsky <[email protected]>
| Newsgroups | gmane.comp.php.cvs.general |
|---|---|
| Message-ID | <[email protected]> |
Author: Ilia Alshanetsky (iliaal)
Date: 2026-06-25T18:25:41-04:00
Commit: https://github.com/php/php-src/commit/bd9d914edaa3591fc346774a8226a88a12bd7f5d
Raw diff: https://github.com/php/php-src/commit/bd9d914edaa3591fc346774a8226a88a12bd7f5d.diff
Merge branch 'PHP-8.5'
* PHP-8.5:
Guard uninitialized SplFileObject in fputcsv() and next()
Changed paths:
A ext/spl/tests/gh16217.phpt
M ext/spl/spl_directory.c
Diff:
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index f662bb8a1dbd..ccab32aec783 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -2150,6 +2150,8 @@ PHP_METHOD(SplFileObject, next)
ZEND_PARSE_PARAMETERS_NONE();
+ CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern);
+
if (!intern->u.file.current_line && Z_ISUNDEF(intern->u.file.current_zval)) {
if (spl_filesystem_file_read_line(ZEND_THIS, intern, true) == FAILURE) {
return;
@@ -2300,6 +2302,8 @@ PHP_METHOD(SplFileObject, fputcsv)
RETURN_THROWS();
}
+ CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern);
+
if (delim) {
if (d_len != 1) {
zend_argument_value_error(2, "must be a single character");
diff --git a/ext/spl/tests/gh16217.phpt b/ext/spl/tests/gh16217.phpt
new file mode 100644
index 000000000000..71760389c8e4
--- /dev/null
+++ b/ext/spl/tests/gh16217.phpt
@@ -0,0 +1,35 @@
+--TEST--
+GH-16217 (SplFileObject methods on an uninitialized object segfault)
+--FILE--
+<?php
+function uninitialized(): SplFileObject {
+ return (new ReflectionClass(SplFileObject::class))->newInstanceWithoutConstructor();
+}
+
+try {
+ (new ReflectionMethod(SplFileObject::class, "fputcsv"))->invoke(uninitialized(), []);
+} catch (Error $e) {
+ echo "fputcsv: ", $e->getMessage(), "\n";
+}
+
+try {
+ (new ReflectionMethod(SplFileObject::class, "next"))->invoke(uninitialized());
+} catch (Error $e) {
+ echo "next: ", $e->getMessage(), "\n";
+}
+
+$obj = uninitialized();
+(new ReflectionMethod(SplFileObject::class, "setFlags"))->invoke($obj, SplFileObject::READ_AHEAD);
+try {
+ (new ReflectionMethod(SplFileObject::class, "next"))->invoke($obj);
+} catch (Error $e) {
+ echo "next (READ_AHEAD): ", $e->getMessage(), "\n";
+}
+
+echo "Done\n";
+?>
+--EXPECT--
+fputcsv: Object not initialized
+next: Object not initialized
+next (READ_AHEAD): Object not initialized
+Done