libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit fb58efc21be3c64e6882d8c7c9182fe3ad68ef65
parent ddaa65e6a178cf5fada9cb45ab4696c25121cc27
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Sun, 30 Aug 2026 13:18:41 +0200

Fixed not saved TLS connection error

Diffstat:
Msrc/mhd2/conn_data_recv.c | 62+++++++++++++++++++++++++++++++++++++++++++++-----------------
Msrc/mhd2/mhd_socket_error.h | 17++++++++++++++++-
Msrc/mhd2/stream_funcs.c | 2++
Msrc/mhd2/upgraded_net.c | 4++++
4 files changed, 67 insertions(+), 18 deletions(-)

diff --git a/src/mhd2/conn_data_recv.c b/src/mhd2/conn_data_recv.c @@ -86,43 +86,71 @@ mhd_conn_data_recv (struct MHD_Connection *c, (char *)buf, &received); + mhd_assert (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err); + if ((mhd_SOCKET_ERR_NO_ERROR != res) || has_err) { /* Handle errors */ if ((mhd_SOCKET_ERR_NO_ERROR == res) && (0 == received)) { c->sk.state.rmt_shut_wr = true; - res = mhd_SOCKET_ERR_REMT_DISCONN; + c->sk.state.discnt_err = mhd_SOCKET_ERR_REMT_DISCONN; + return; } - if (has_err && (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err)) + if (mhd_SOCKET_ERR_IS_HARD (res) + || has_err) { - /* Try to get the real error from the socket */ - if (!mhd_SOCKET_ERR_IS_HARD (res) && c->sk.props.is_nonblck) - { - /* Re-try the last time with direct socket recv() to detect the error */ - uint_fast64_t dummy_buf; - res = mhd_sckt_recv (&(c->sk), - sizeof(dummy_buf), - (char *)&dummy_buf, - &received); - } - if (mhd_SOCKET_ERR_IS_HARD (res)) + /* Hard error. Clarify and set disconnect error. */ + if (mhd_SOCKET_ERR_IS_NOT_SCKT (res)) { c->sk.state.discnt_err = res; - mhd_SCKT_NET_ST_SET_FLAG (&(c->sk.ready), - mhd_SOCKET_NET_STATE_ERROR_READY); } else { - c->sk.state.discnt_err = mhd_socket_error_get_from_socket (c->sk.fd); - mhd_assert (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err); + if (!mhd_SOCKET_ERR_IS_HARD (res) + && (c->sk.props.is_nonblck)) + { + /* Re-try the last time with direct socket recv() to detect the error */ + uint_fast64_t dummy_buf; + enum mhd_SocketError raw_sckt_err; + + mhd_assert (has_err); + + raw_sckt_err = mhd_sckt_recv (&(c->sk), + sizeof(dummy_buf), + (char *)&dummy_buf, + &received); + if (mhd_SOCKET_ERR_IS_HARD (raw_sckt_err)) + res = raw_sckt_err; + } + + if (!mhd_SOCKET_ERR_IS_HARD (res)) + { + mhd_assert (has_err); + c->sk.state.discnt_err = + mhd_socket_error_get_from_socket (c->sk.fd); + } + else + { + c->sk.state.discnt_err = res; + mhd_SCKT_NET_ST_SET_FLAG (&(c->sk.ready), + mhd_SOCKET_NET_STATE_ERROR_READY); + } } + + mhd_assert (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err); + mhd_assert (mhd_SOCKET_ERR_IS_HARD (c->sk.state.discnt_err)); + return; } + mhd_assert (!mhd_SOCKET_ERR_IS_HARD (c->sk.state.discnt_err)); return; } + mhd_assert (!mhd_SOCKET_ERR_IS_HARD (res)); + mhd_assert (!has_err); + if (0 == received) c->sk.state.rmt_shut_wr = true; diff --git a/src/mhd2/mhd_socket_error.h b/src/mhd2/mhd_socket_error.h @@ -96,11 +96,13 @@ enum MHD_FIXED_ENUM_ mhd_SocketError * any other reason. */ mhd_SOCKET_ERR_NOTCONN +#ifdef MHD_SUPPORT_HTTPS , /** - * General TLS encryption or decryption error + * General TLS encryption or decryption error or other TLS-related error. */ mhd_SOCKET_ERR_TLS +#endif /* MHD_SUPPORT_HTTPS */ , /** * The socket has been shut down for writing or no longer connected @@ -157,4 +159,17 @@ enum MHD_FIXED_ENUM_ mhd_SocketError */ #define mhd_SOCKET_ERR_IS_BAD(err) (mhd_SOCKET_ERR_BADF <= (err)) +/** + * Check whether the socket error is actually artificial, not a socket error + * @warning This macro may evaluate its argument multiple times, + * so do not use it with expressions! + */ +#ifdef MHD_SUPPORT_HTTPS +# define mhd_SOCKET_ERR_IS_NOT_SCKT(err) \ + ((mhd_SOCKET_ERR_TLS == (err)) || (mhd_SOCKET_ERR_INTERNAL == (err))) +#else /* ! MHD_SUPPORT_HTTPS */ +# define mhd_SOCKET_ERR_IS_NOT_SCKT(err) \ + (mhd_SOCKET_ERR_INTERNAL == (err)) +#endif /* ! MHD_SUPPORT_HTTPS */ + #endif /* ! MHD_SOCKET_ERROR_H */ diff --git a/src/mhd2/stream_funcs.c b/src/mhd2/stream_funcs.c @@ -908,7 +908,9 @@ mhd_conn_start_closing (struct MHD_Connection *restrict c, break; case mhd_SOCKET_ERR_CONN_BROKEN: case mhd_SOCKET_ERR_NOTCONN: +#ifdef MHD_SUPPORT_HTTPS case mhd_SOCKET_ERR_TLS: +#endif /* MHD_SUPPORT_HTTPS */ case mhd_SOCKET_ERR_PIPE: case mhd_SOCKET_ERR_NOT_CHECKED: case mhd_SOCKET_ERR_BADF: diff --git a/src/mhd2/upgraded_net.c b/src/mhd2/upgraded_net.c @@ -338,8 +338,10 @@ MHD_upgraded_recv (struct MHD_UpgradedHandle *MHD_RESTRICT urh, return MHD_SC_UPGRADED_NET_TIMEOUT; if (mhd_SOCKET_ERR_REMT_DISCONN == res) return MHD_SC_UPGRADED_NET_CONN_CLOSED; +#ifdef MHD_SUPPORT_HTTPS if (mhd_SOCKET_ERR_TLS == res) return MHD_SC_UPGRADED_TLS_ERROR; +#endif /* MHD_SUPPORT_HTTPS */ if (!mhd_SOCKET_ERR_IS_BAD (res)) return MHD_SC_UPGRADED_NET_CONN_BROKEN; @@ -406,8 +408,10 @@ MHD_upgraded_send (struct MHD_UpgradedHandle *MHD_RESTRICT urh, if (mhd_SOCKET_ERR_REMT_DISCONN == res) return MHD_SC_UPGRADED_NET_CONN_CLOSED; +#ifdef MHD_SUPPORT_HTTPS if (mhd_SOCKET_ERR_TLS == res) return MHD_SC_UPGRADED_TLS_ERROR; +#endif /* MHD_SUPPORT_HTTPS */ if (!mhd_SOCKET_ERR_IS_BAD (res)) return MHD_SC_UPGRADED_NET_CONN_BROKEN;