From 0171cced8967d7c75fd04f578267f760cb6abc7b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Nov 2020 12:30:17 +0100 Subject: [PATCH] Add flag to suppress stream errors --- ext/mysqlnd/mysqlnd_vio.c | 1 + ext/mysqlnd/mysqlnd_wireprotocol.c | 9 --------- main/php_streams.h | 4 ++++ main/streams/plain_wrapper.c | 8 ++++++-- main/streams/xp_socket.c | 9 ++++++--- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_vio.c b/ext/mysqlnd/mysqlnd_vio.c index bc59cbeed845e..e33761f278251 100644 --- a/ext/mysqlnd/mysqlnd_vio.c +++ b/ext/mysqlnd/mysqlnd_vio.c @@ -263,6 +263,7 @@ MYSQLND_METHOD(mysqlnd_vio, post_connect_set_opt)(MYSQLND_VIO * const vio, const } net_stream->chunk_size = vio->data->options.net_read_buffer_size; + net_stream->flags |= PHP_STREAM_FLAG_SUPPRESS_ERRORS; } DBG_VOID_RETURN; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index e11d42d8bd6f8..33a000d9a6b20 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -971,7 +971,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) MYSQLND_VIO * vio = conn->vio; MYSQLND_STATS * stats = conn->stats; MYSQLND_CONNECTION_STATE * connection_state = &conn->state; - const unsigned int error_reporting = EG(error_reporting); size_t sent = 0; DBG_ENTER("php_mysqlnd_cmd_write"); @@ -981,10 +980,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) */ pfc->data->m.reset(pfc, stats, error_info); - if (error_reporting) { - EG(error_reporting) = 0; - } - MYSQLND_INC_CONN_STATISTIC(stats, STAT_PACKETS_SENT_CMD); #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND @@ -1017,10 +1012,6 @@ size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA * conn, void * _packet) } } end: - if (error_reporting) { - /* restore error reporting */ - EG(error_reporting) = error_reporting; - } if (!sent) { SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT); } diff --git a/main/php_streams.h b/main/php_streams.h index 73740a7a7907c..6d6c73bb95706 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -181,6 +181,10 @@ struct _php_stream_wrapper { #define PHP_STREAM_FLAG_NO_FCLOSE 0x80 +/* Suppress generation of PHP warnings on stream read/write errors. + * Currently for internal use only. */ +#define PHP_STREAM_FLAG_SUPPRESS_ERRORS 0x100 + #define PHP_STREAM_FLAG_WAS_WRITTEN 0x80000000 struct _php_stream { diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 8a891ddf720ad..e3eda978d87bd 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -358,7 +358,9 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun /* TODO: Should this be treated as a proper error or not? */ return bytes_written; } - php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + php_error_docref(NULL, E_NOTICE, "Write of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + } } return bytes_written; } else { @@ -426,7 +428,9 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count) } else if (errno == EINTR) { /* TODO: Should this be treated as a proper error or not? */ } else { - php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + php_error_docref(NULL, E_NOTICE, "Read of %zu bytes failed with errno=%d %s", count, errno, strerror(errno)); + } /* TODO: Remove this special-case? */ if (errno != EBADF) { diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index f3370e89f7e69..a369bf5ff2d8c 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -103,10 +103,13 @@ static ssize_t php_sockop_write(php_stream *stream, const char *buf, size_t coun } } - estr = php_socket_strerror(err, NULL, 0); - php_error_docref(NULL, E_NOTICE, "Send of " ZEND_LONG_FMT " bytes failed with errno=%d %s", + if (!(stream->flags & PHP_STREAM_FLAG_SUPPRESS_ERRORS)) { + estr = php_socket_strerror(err, NULL, 0); + php_error_docref(NULL, E_NOTICE, + "Send of " ZEND_LONG_FMT " bytes failed with errno=%d %s", (zend_long)count, err, estr); - efree(estr); + efree(estr); + } } if (didwrite > 0) {