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:
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;
}