libmicrohttpd2

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

commit 9b1c0b5c5846a9cdef961d17a70b0b2685e16209
parent d1a06315c5f43c526e3711da4fba58b751aab65e
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Mon,  8 Dec 2025 21:36:53 +0100

Make sure that disconnect status is always set if error was detected

Diffstat:
Msrc/mhd2/conn_data_process.c | 18++++++++++++++++++
Msrc/mhd2/conn_data_recv.c | 8+++++++-
Msrc/mhd2/conn_data_send.c | 7+++++++
Msrc/mhd2/h2/h2_comm.c | 1-
Msrc/mhd2/stream_process_states.c | 13++++++-------
5 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/src/mhd2/conn_data_process.c b/src/mhd2/conn_data_process.c @@ -54,6 +54,7 @@ #include "sys_base_types.h" #include "mhd_assert.h" +#include "mhd_assume.h" #include "mhd_unreachable.h" #include "mhd_constexpr.h" @@ -62,6 +63,8 @@ #include "mhd_daemon.h" #include "mhd_connection.h" +#include "mhd_socket_error_funcs.h" + #include "daemon_logger.h" #include "mhd_comm_layer_state.h" @@ -128,6 +131,7 @@ mhd_conn_process_recv_send_data (struct MHD_Connection *restrict c) (0 != (MHD_EVENT_LOOP_INFO_SEND & c->event_loop_info))); has_sock_err = (0 != (mhd_SOCKET_NET_STATE_ERROR_READY & c->sk.ready)); + mhd_assert (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err); if (0 != (MHD_EVENT_LOOP_INFO_RECV & c->event_loop_info)) { @@ -140,11 +144,14 @@ mhd_conn_process_recv_send_data (struct MHD_Connection *restrict c) if (use_recv) { mhd_conn_data_recv (c, has_sock_err); + mhd_assert (! has_sock_err || + (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err)); if (! mhd_C_IS_HTTP2 (c)) { if (! mhd_conn_process_data (c)) return false; data_processed = true; + mhd_ASSUME (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err); } } } @@ -173,15 +180,26 @@ mhd_conn_process_recv_send_data (struct MHD_Connection *restrict c) if (use_send) { mhd_conn_data_send (c); + mhd_assert (! has_sock_err || + (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err)); if (! mhd_C_IS_HTTP2 (c)) { if (! mhd_conn_process_data (c)) return false; data_processed = true; + mhd_ASSUME (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err); } } } + if (mhd_SCKT_NET_ST_HAS_FLAG (c->sk.ready, + mhd_SOCKET_NET_STATE_ERROR_READY) && + (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err)) + { + c->sk.state.discnt_err = mhd_socket_error_get_from_socket (c->sk.fd); + mhd_ASSUME (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err); + } + if (! data_processed || mhd_C_IS_HTTP2 (c)) return mhd_conn_process_data (c); diff --git a/src/mhd2/conn_data_recv.c b/src/mhd2/conn_data_recv.c @@ -55,8 +55,10 @@ #include "mhd_connection.h" -#include "mhd_recv.h" #include "stream_funcs.h" +#include "mhd_socket_error_funcs.h" + +#include "mhd_recv.h" MHD_INTERNAL MHD_FN_PAR_NONNULL_ALL_ void mhd_conn_data_recv (struct MHD_Connection *restrict c, @@ -104,6 +106,10 @@ mhd_conn_data_recv (struct MHD_Connection *restrict c, (enum mhd_SocketNetState) (((unsigned int) c->sk.ready) | mhd_SOCKET_NET_STATE_ERROR_READY); } + else if (has_err && + (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err)) + c->sk.state.discnt_err = mhd_socket_error_get_from_socket (c->sk.fd); + return; } diff --git a/src/mhd2/conn_data_send.c b/src/mhd2/conn_data_send.c @@ -61,6 +61,8 @@ #include "mhd_socket_error.h" +#include "mhd_socket_error_funcs.h" + #include "mhd_send.h" #include "stream_funcs.h" @@ -411,4 +413,9 @@ mhd_conn_data_send (struct MHD_Connection *restrict c) (enum mhd_SocketNetState) (((unsigned int) c->sk.ready) | mhd_SOCKET_NET_STATE_ERROR_READY); } + + if (mhd_SCKT_NET_ST_HAS_FLAG (c->sk.ready, + mhd_SOCKET_NET_STATE_ERROR_READY) && + (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err)) + c->sk.state.discnt_err = mhd_socket_error_get_from_socket (c->sk.fd); } diff --git a/src/mhd2/h2/h2_comm.c b/src/mhd2/h2/h2_comm.c @@ -596,7 +596,6 @@ mhd_h2_conn_process_data (struct MHD_Connection *restrict c) mhd_assert (mhd_HTTP_LAYER_CLOSED != c->h_layer.state); if ((mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err) || - (0 != (c->sk.ready & mhd_SOCKET_NET_STATE_ERROR_READY)) || (mhd_HTTP_LAYER_CLOSING == c->h_layer.state)) { mhd_h2_conn_h2_deinit_start_closing (c); diff --git a/src/mhd2/stream_process_states.c b/src/mhd2/stream_process_states.c @@ -377,14 +377,13 @@ mhd_conn_process_data (struct MHD_Connection *restrict c) if (c->resuming) finish_resume (c); - if ((mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err) || - (0 != (c->sk.ready & mhd_SOCKET_NET_STATE_ERROR_READY))) + mhd_assert ((! mhd_SCKT_NET_ST_HAS_FLAG (c->sk.ready, + mhd_SOCKET_NET_STATE_ERROR_READY)) + || (mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err)); + + if (mhd_SOCKET_ERR_NO_ERROR != c->sk.state.discnt_err) { - mhd_assert ((mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err) || \ - mhd_SOCKET_ERR_IS_HARD (c->sk.state.discnt_err)); - if ((mhd_SOCKET_ERR_NO_ERROR == c->sk.state.discnt_err) || - (mhd_SOCKET_ERR_NOT_CHECKED == c->sk.state.discnt_err)) - c->sk.state.discnt_err = mhd_socket_error_get_from_socket (c->sk.fd); + mhd_assert (mhd_SOCKET_ERR_IS_HARD (c->sk.state.discnt_err)); mhd_conn_start_closing_skt_err (c); return false; }