diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 1468cec6ccf3d..89af25dd9d354 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2099,7 +2099,11 @@ PHP_METHOD(SplFileObject, fgets) spl_filesystem_file_free_line(intern); intern->u.file.current_line_num++; } else { - if (spl_filesystem_file_read_ex(intern, /* silent */ false, /* line_add */ 1, /* csv */ false) == FAILURE) { + if (spl_filesystem_file_read_ex(intern, /* silent */ true, /* line_add */ 1, /* csv */ false) == FAILURE) { + if (php_stream_eof(intern->u.file.stream)) { + RETURN_EMPTY_STRING(); + } + spl_filesystem_file_cannot_read(intern); RETURN_THROWS(); } RETVAL_STR_COPY(intern->u.file.current_line); diff --git a/ext/spl/tests/SplFileObject/gh21742.phpt b/ext/spl/tests/SplFileObject/gh21742.phpt new file mode 100644 index 0000000000000..7ea60b53915a0 --- /dev/null +++ b/ext/spl/tests/SplFileObject/gh21742.phpt @@ -0,0 +1,35 @@ +--TEST-- +GH-21742 (SplFileObject::fgets() throws at EOF in while (!$spl->eof()) loop) +--FILE-- +eof()) { + echo $spl->fgets(); +} +echo "clean exit\n"; + +$empty = tempnam(sys_get_temp_dir(), 'spl'); +file_put_contents($empty, ''); +$spl2 = new SplFileObject($empty, 'r'); +$iter = 0; +while (!$spl2->eof()) { + $iter++; + $spl2->fgets(); + if ($iter > 3) break; +} +echo "empty-file iters=$iter\n"; + +unlink($file); +unlink($empty); +?> +--EXPECT-- +Line 0 +Line 1 +Line 2 +Line 3 +Line 4 +clean exit +empty-file iters=1