libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 3777686c912cc6102694e55862302aec9a16812b
parent 0c2fd79ba3d02659c8e223c4a8e6b9e6d9716018
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sun,  4 Jun 2017 23:37:41 +0300

Do not use errno to return errors from recv_param_adapter()/recv_tls_adapter()

Diffstat:
Msrc/microhttpd/connection.c | 32++++++++++++++++++++------------
Msrc/microhttpd/connection.h | 30++++++++++++++++++++++++++++++
Msrc/microhttpd/connection_https.c | 12+++++-------
3 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c @@ -118,7 +118,8 @@ * @param connection the MHD connection structure * @param other where to write received data to * @param i maximum size of other (in bytes) - * @return number of bytes actually received + * @return positive value for number of bytes actually received or + * negative value for error number MHD_ERR_xxx_ */ static ssize_t recv_param_adapter (struct MHD_Connection *connection, @@ -130,8 +131,7 @@ recv_param_adapter (struct MHD_Connection *connection, if ( (MHD_INVALID_SOCKET == connection->socket_fd) || (MHD_CONNECTION_CLOSED == connection->state) ) { - MHD_socket_set_error_ (MHD_SCKT_ENOTCONN_); - return -1; + return MHD_ERR_NOTCONN_; } if (i > MHD_SCKT_SEND_MAX_SIZE_) i = MHD_SCKT_SEND_MAX_SIZE_; /* return value limit */ @@ -139,16 +139,26 @@ recv_param_adapter (struct MHD_Connection *connection, ret = MHD_recv_ (connection->socket_fd, other, i); -#ifdef EPOLL_SUPPORT if (0 > ret) { - /* Got EAGAIN --- no longer read-ready */ - if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ())) - connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY; + const int err = MHD_socket_get_error_ (); + if (MHD_SCKT_ERR_IS_EAGAIN_ (err)) + { +#ifdef EPOLL_SUPPORT + /* Got EAGAIN --- no longer read-ready */ + connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY; +#endif /* EPOLL_SUPPORT */ + return MHD_ERR_AGAIN_; + } + if (MHD_SCKT_ERR_IS_EINTR_ (err)) + return MHD_ERR_AGAIN_; + /* Treat any other error as hard error. */ + return MHD_ERR_CONNRESET_; } +#ifdef EPOLL_SUPPORT else if (i > (size_t)ret) connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY; -#endif +#endif /* EPOLL_SUPPORT */ return ret; } @@ -2660,11 +2670,9 @@ MHD_connection_handle_read (struct MHD_Connection *connection) connection->read_buffer_offset); if (bytes_read < 0) { - const int err = MHD_socket_get_error_ (); - if (MHD_SCKT_ERR_IS_EINTR_ (err) || - MHD_SCKT_ERR_IS_EAGAIN_ (err)) + if (MHD_ERR_AGAIN_ == bytes_read) return MHD_YES; /* No new data to process. */ - if (MHD_SCKT_ERR_IS_REMOTE_DISCNN_ (err)) + if (MHD_ERR_CONNRESET_ == bytes_read) { CONNECTION_CLOSE_ERROR (connection, (MHD_CONNECTION_INIT == connection->state) ? diff --git a/src/microhttpd/connection.h b/src/microhttpd/connection.h @@ -30,6 +30,36 @@ #include "internal.h" +/** + * Error code similar to EGAIN or EINTR + */ +#define MHD_ERR_AGAIN_ (-3073) + +/** + * "Connection (remote) reset" error code + */ +#define MHD_ERR_CONNRESET_ (-3074) + +/** + * "Not connected" error code + */ +#define MHD_ERR_NOTCONN_ (-3075) + +/** + * "Not enough memory" error code + */ +#define MHD_ERR_NOMEM_ (-3076) + +/** + * "Bad FD" error code + */ +#define MHD_ERR_BADF_ (-3077) + +/** + * Error code similar to EINVAL + */ +#define MHD_ERR_INVAL_ (-3078) + /** * Set callbacks for this connection to those for HTTP. diff --git a/src/microhttpd/connection_https.c b/src/microhttpd/connection_https.c @@ -41,7 +41,8 @@ * @param connection the MHD_Connection structure * @param other where to write received data to * @param i maximum size of other (in bytes) - * @return number of bytes actually received + * @return positive value for number of bytes actually received or + * negative value for error number MHD_ERR_xxx_ */ static ssize_t recv_tls_adapter (struct MHD_Connection *connection, @@ -59,21 +60,18 @@ recv_tls_adapter (struct MHD_Connection *connection, if ( (GNUTLS_E_AGAIN == res) || (GNUTLS_E_INTERRUPTED == res) ) { - MHD_socket_set_error_ (MHD_SCKT_EINTR_); #ifdef EPOLL_SUPPORT if (GNUTLS_E_AGAIN == res) connection->epoll_state &= ~MHD_EPOLL_STATE_READ_READY; #endif - return -1; + return MHD_ERR_AGAIN_; } if (res < 0) { /* Likely 'GNUTLS_E_INVALID_SESSION' (client communication - disrupted); set errno to something caller will interpret - correctly as a hard error */ - MHD_socket_set_error_ (MHD_SCKT_ECONNRESET_); + disrupted); interpret as a hard error */ connection->tls_read_ready = false; - return res; + return MHD_ERR_CONNRESET_; } #ifdef EPOLL_SUPPORT