diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-26 12:30:17 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-30 15:06:28 +0100 |
commit | 24a19cc232668b5b839932a120d663b903729777 (patch) | |
tree | 25904cc1dfea23deedfca9b3abbbc73c48dc459d /main | |
parent | a0baa09b99adf4f65792e26a8af461a8fa4c97dc (diff) | |
download | php-git-24a19cc232668b5b839932a120d663b903729777.tar.gz |
Suppress stream errors in mysqlnd
mysqlnd currently sets error_reporting=0 to suppress errors while
writing to streams. Unfortunately these errors are still visible
to userland error handlers, which is a source of confusion.
See for example https://bugs.php.net/bug.php?id=80412.
Instead add a stream flag that suppresses the emission of
read/write errors in the first place, and set it in mysqlnd.
I think it might be useful to have this option for userland as
well in the future, but for now this is just an internal
mechanism.
Closes GH-6458.
Diffstat (limited to 'main')
-rw-r--r-- | main/php_streams.h | 4 | ||||
-rw-r--r-- | main/streams/plain_wrapper.c | 8 | ||||
-rw-r--r-- | main/streams/xp_socket.c | 9 |
3 files changed, 16 insertions, 5 deletions
diff --git a/main/php_streams.h b/main/php_streams.h index 73740a7a79..6d6c73bb95 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 8a891ddf72..e3eda978d8 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 f3370e89f7..a369bf5ff2 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -103,10 +103,13 @@ retry: } } - 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) { |