From c6ad5614c6e263e2e545dbe011e1e2f7b28d4cd6 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 24 Jun 2026 11:31:06 -0700 Subject: [PATCH] rsrv: old TCP client tar pit A short message could underflow, leaving a too old client stuck in a tar pit. An acceptable outcome, but not intended. Instead, send back errors to each message. --- modules/database/src/ioc/rsrv/camessage.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/database/src/ioc/rsrv/camessage.c b/modules/database/src/ioc/rsrv/camessage.c index fd40f5ce0..736c39303 100644 --- a/modules/database/src/ioc/rsrv/camessage.c +++ b/modules/database/src/ioc/rsrv/camessage.c @@ -2437,9 +2437,15 @@ int camessage ( struct client *client ) SEND_UNLOCK(client); log_header ( "CAS: Client version too old", client, &msg, 0, nmsg ); - client->recvBytesToDrain = msgsize - bytes_left; - client->recv.stk = client->recv.cnt; - status = RSRV_OK; + if (msgsize >= bytes_left) { + client->recvBytesToDrain = msgsize - bytes_left; + client->recv.stk = client->recv.cnt; + status = RSRV_OK; + break; + } else { // msgsize < bytes_left + client->recv.stk += msgsize; + continue; + } } else { /* silently ignore UDP from old clients */ status = RSRV_ERROR;