From: Lukáš Ondráček Date: Wed, 6 Nov 2024 17:26:14 +0000 (+0100) Subject: daemon/io: keep TCP data in system queue on buffer overflow X-Git-Tag: v6.0.10~6^2~38 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ea3f10cd0d8668ff1f19fc397f78a7929648403;p=thirdparty%2Fknot-resolver.git daemon/io: keep TCP data in system queue on buffer overflow --- diff --git a/daemon/io.c b/daemon/io.c index 366489075..98500c347 100644 --- a/daemon/io.c +++ b/daemon/io.c @@ -324,6 +324,20 @@ static void tcp_recv(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) return; } + if (nread == UV_ENOBUFS) { + /* No space available in session buffer. + * The connection may be just waiting in defer. + * Ignore the error and keep the data in system queue for later reading or timeout. */ + if (kr_log_is_debug(IO, NULL)) { + struct sockaddr *peer = session2_get_peer(s); + char *peer_str = kr_straddr(peer); + kr_log_debug(IO, "=> incoming data from '%s' waiting (%s)\n", + peer_str ? peer_str : "", + uv_strerror(nread)); + } + return; + } + if (nread < 0 || !buf->base) { if (kr_log_is_debug(IO, NULL)) { struct sockaddr *peer = session2_get_peer(s);