Skip to content

Commit 980385d

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Stop closing stderr and stdout streams (#8570) Revert "XFAIL tests (GH-8588)" XFAIL tests (GH-8588) Stop closing stderr and stdout streams (#8569)
2 parents 46b35c6 + ffd27bd commit 980385d

File tree

4 files changed

+32
-9
lines changed

4 files changed

+32
-9
lines changed

ext/zend_test/php_test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
5151
HashTable global_weakmap;
5252
int replace_zend_execute_ex;
5353
int register_passes;
54+
bool print_stderr_mshutdown;
5455
zend_test_fiber *active_fiber;
5556
ZEND_END_MODULE_GLOBALS(zend_test)
5657

ext/zend_test/test.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override)
495495
PHP_INI_BEGIN()
496496
STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals)
497497
STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
498+
STD_PHP_INI_BOOLEAN("zend_test.print_stderr_mshutdown", "0", PHP_INI_SYSTEM, OnUpdateBool, print_stderr_mshutdown, zend_zend_test_globals, zend_test_globals)
498499
PHP_INI_END()
499500

500501
void (*old_zend_execute_ex)(zend_execute_data *execute_data);
@@ -620,6 +621,10 @@ PHP_MSHUTDOWN_FUNCTION(zend_test)
620621

621622
zend_test_observer_shutdown(SHUTDOWN_FUNC_ARGS_PASSTHRU);
622623

624+
if (ZT_G(print_stderr_mshutdown)) {
625+
fprintf(stderr, "[zend-test] MSHUTDOWN\n");
626+
}
627+
623628
return SUCCESS;
624629
}
625630

ext/zend_test/tests/gh8575.phpt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
--TEST--
2+
CLI: stderr is available in mshutdown
3+
--SKIPIF--
4+
<?php if (php_sapi_name() != "cli") die('skip cli test only'); ?>
5+
--EXTENSIONS--
6+
zend_test
7+
--INI--
8+
zend_test.print_stderr_mshutdown=1
9+
--FILE--
10+
==DONE==
11+
--EXPECTF--
12+
==DONE==
13+
[zend-test] MSHUTDOWN

sapi/cli/php_cli.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -536,19 +536,23 @@ static void cli_register_file_handles(bool no_close) /* {{{ */
536536
s_out = php_stream_open_wrapper_ex("php://stdout", "wb", 0, NULL, sc_out);
537537
s_err = php_stream_open_wrapper_ex("php://stderr", "wb", 0, NULL, sc_err);
538538

539+
/* Release stream resources, but don't free the underlying handles. Othewrise,
540+
* extensions which write to stderr or company during mshutdown/gshutdown
541+
* won't have the expected functionality.
542+
*/
543+
if (no_close) {
544+
if (s_in) s_in->flags |= PHP_STREAM_FLAG_NO_CLOSE;
545+
if (s_out) s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
546+
if (s_err) s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
547+
}
548+
539549
if (s_in==NULL || s_out==NULL || s_err==NULL) {
540550
if (s_in) php_stream_close(s_in);
541551
if (s_out) php_stream_close(s_out);
542552
if (s_err) php_stream_close(s_err);
543553
return;
544554
}
545555

546-
if (no_close) {
547-
s_in->flags |= PHP_STREAM_FLAG_NO_CLOSE;
548-
s_out->flags |= PHP_STREAM_FLAG_NO_CLOSE;
549-
s_err->flags |= PHP_STREAM_FLAG_NO_CLOSE;
550-
}
551-
552556
s_in_process = s_in;
553557

554558
php_stream_to_zval(s_in, &ic.value);
@@ -954,7 +958,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
954958
switch (behavior) {
955959
case PHP_MODE_STANDARD:
956960
if (script_file) {
957-
cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
961+
cli_register_file_handles(/* no_close */ true);
958962
}
959963

960964
if (interactive) {
@@ -989,7 +993,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
989993
}
990994
break;
991995
case PHP_MODE_CLI_DIRECT:
992-
cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
996+
cli_register_file_handles(/* no_close */ true);
993997
zend_eval_string_ex(exec_direct, NULL, "Command line code", 1);
994998
break;
995999

@@ -1004,7 +1008,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
10041008
file_handle.filename = NULL;
10051009
}
10061010

1007-
cli_register_file_handles(/* no_close */ PHP_DEBUG || num_repeats > 1);
1011+
cli_register_file_handles(/* no_close */ true);
10081012

10091013
if (exec_begin) {
10101014
zend_eval_string_ex(exec_begin, NULL, "Command line begin code", 1);

0 commit comments

Comments
 (0)