streams: Checking if a stream is castable should not emit warnings for user defined streams

Closes GH-10435
This commit is contained in:
George Peter Banyard 2023-01-24 15:04:23 +00:00
parent 64ebadcac5
commit d68073c23b
No known key found for this signature in database
GPG key ID: 3306078E3194AEBD
3 changed files with 37 additions and 6 deletions

1
NEWS
View file

@ -14,6 +14,7 @@ PHP NEWS
that is unset in error handler). (Girgias) that is unset in error handler). (Girgias)
. Fixed bug GH-12102 (Incorrect compile error when using array access on TMP . Fixed bug GH-12102 (Incorrect compile error when using array access on TMP
value in function call). (ilutov) value in function call). (ilutov)
. Fixed warning emitted when checking if a user stream is castable. (Girgias)
- FPM: - FPM:
. Fixed GH-12077 (PHP 8.3.0RC1 borked socket-close-on-exec.phpt). . Fixed GH-12077 (PHP 8.3.0RC1 borked socket-close-on-exec.phpt).

View file

@ -1384,6 +1384,8 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr)
php_stream * intstream = NULL; php_stream * intstream = NULL;
int call_result; int call_result;
int ret = FAILURE; int ret = FAILURE;
/* If we are checking if the stream can cast, no return pointer is provided, so do not emit errors */
bool report_errors = retptr;
ZVAL_STRINGL(&func_name, USERSTREAM_CAST, sizeof(USERSTREAM_CAST)-1); ZVAL_STRINGL(&func_name, USERSTREAM_CAST, sizeof(USERSTREAM_CAST)-1);
@ -1400,8 +1402,10 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr)
do { do {
if (call_result == FAILURE) { if (call_result == FAILURE) {
if (report_errors) {
php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " is not implemented!", php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " is not implemented!",
ZSTR_VAL(us->wrapper->ce->name)); ZSTR_VAL(us->wrapper->ce->name));
}
break; break;
} }
if (!zend_is_true(&retval)) { if (!zend_is_true(&retval)) {
@ -1409,13 +1413,17 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr)
} }
php_stream_from_zval_no_verify(intstream, &retval); php_stream_from_zval_no_verify(intstream, &retval);
if (!intstream) { if (!intstream) {
if (report_errors) {
php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must return a stream resource", php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must return a stream resource",
ZSTR_VAL(us->wrapper->ce->name)); ZSTR_VAL(us->wrapper->ce->name));
}
break; break;
} }
if (intstream == stream) { if (intstream == stream) {
if (report_errors) {
php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must not return itself", php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_CAST " must not return itself",
ZSTR_VAL(us->wrapper->ce->name)); ZSTR_VAL(us->wrapper->ce->name));
}
intstream = NULL; intstream = NULL;
break; break;
} }

View file

@ -0,0 +1,22 @@
--TEST--
Non castable user-space streams (stream_cast())
--FILE--
<?php
class test_wrapper {
public $context;
public $return_value;
function stream_open($path, $mode, $openedpath) {
return true;
}
function stream_eof() {
return false;
}
}
stream_wrapper_register('test', 'test_wrapper');
$fd = fopen("test://foo","r");
var_dump(stream_isatty($fd));
?>
--EXPECT--
bool(false)