From 150ebfdf77320b24b0358f8a903e90d7940ad4a4 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 23 Sep 2020 23:46:58 +0100 Subject: [PATCH] Suppress bogus [-Wlogical-op] warning from GCC See GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 which emits the warning for (errno == EWOULDBLOCK || errno == EAGAIN) which is the correct way of handling errors as the value of EWOULDBLOCK and EAGAIN is implementation defined. Therefore introduce a new macro function PHP_IS_TRANSIENT_ERROR() which handles the case when EWOULDBLOCK and EAGAIN are identical. Thanks to @twose for the idea. --- ext/sockets/sockets.c | 6 +----- main/php_network.h | 7 +++++++ main/streams/plain_wrapper.c | 4 ++-- main/streams/xp_socket.c | 5 +++-- sapi/fpm/fpm/fpm_stdio.c | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 0b21c4f6843..c50d8d5d71b 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1045,11 +1045,7 @@ PHP_FUNCTION(socket_read) if (retval == -1) { /* if the socket is in non-blocking mode and there's no data to read, don't output any error, as this is a normal situation, and not an error */ - if (errno == EAGAIN -#ifdef EWOULDBLOCK - || errno == EWOULDBLOCK -#endif - ) { + if (PHP_IS_TRANSIENT_ERROR(errno)) { php_sock->error = errno; SOCKETS_G(last_error) = errno; } else { diff --git a/main/php_network.h b/main/php_network.h index 437069b4fcc..5c8cee3fa8a 100644 --- a/main/php_network.h +++ b/main/php_network.h @@ -49,6 +49,13 @@ # define EWOULDBLOCK EAGAIN #endif +/* This is a work around for GCC bug 69602: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 */ +#if EAGAIN != EWOULDBLOCK +# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN || err == EWOULDBLOCK) +#else +# define PHP_IS_TRANSIENT_ERROR(err) (err == EAGAIN) +#endif + #ifdef PHP_WIN32 #define php_socket_errno() WSAGetLastError() #else diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 8a891ddf720..0373cc4c947 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -351,7 +351,7 @@ static ssize_t php_stdiop_write(php_stream *stream, const char *buf, size_t coun ssize_t bytes_written = write(data->fd, buf, count); #endif if (bytes_written < 0) { - if (errno == EWOULDBLOCK || errno == EAGAIN) { + if (PHP_IS_TRANSIENT_ERROR(errno)) { return 0; } if (errno == EINTR) { @@ -420,7 +420,7 @@ static ssize_t php_stdiop_read(php_stream *stream, char *buf, size_t count) } if (ret < 0) { - if (errno == EWOULDBLOCK || errno == EAGAIN) { + if (PHP_IS_TRANSIENT_ERROR(errno)) { /* Not an error. */ ret = 0; } else if (errno == EINTR) { diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index f3370e89f7e..cd67fcb8ca3 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -75,7 +75,8 @@ retry: if (didwrite <= 0) { char *estr; int err = php_socket_errno(); - if (err == EWOULDBLOCK || err == EAGAIN) { + + if (PHP_IS_TRANSIENT_ERROR(err)) { if (sock->is_blocked) { int retval; @@ -166,7 +167,7 @@ static ssize_t php_sockop_read(php_stream *stream, char *buf, size_t count) err = php_socket_errno(); if (nr_bytes < 0) { - if (err == EAGAIN || err == EWOULDBLOCK) { + if (PHP_IS_TRANSIENT_ERROR(err)) { nr_bytes = 0; } else { stream->eof = 1; diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c index 1742467b368..42ea1594301 100644 --- a/sapi/fpm/fpm/fpm_stdio.c +++ b/sapi/fpm/fpm/fpm_stdio.c @@ -10,6 +10,7 @@ #include #include "php_syslog.h" +#include "php_network.h" #include "fpm.h" #include "fpm_children.h" @@ -166,7 +167,7 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg) stdio_read: in_buf = read(fd, buf, max_buf_size - 1); if (in_buf <= 0) { /* no data */ - if (in_buf == 0 || (errno != EAGAIN && errno != EWOULDBLOCK)) { + if (in_buf == 0 || !PHP_IS_TRANSIENT_ERROR(errno)) { /* pipe is closed or error */ read_fail = (in_buf < 0) ? in_buf : 1; }