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