]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/io: keep TCP data in system queue on buffer overflow docs-develop-defe-x6j6qe/deployments/5517
authorLukáš Ondráček <lukas.ondracek@nic.cz>
Wed, 6 Nov 2024 17:26:14 +0000 (18:26 +0100)
committerLukáš Ondráček <lukas.ondracek@nic.cz>
Wed, 6 Nov 2024 17:26:14 +0000 (18:26 +0100)
daemon/io.c

index 3664890752f75cef13280835e5d8edc22a305402..98500c347d8508fedf231fb98287679af8a64da9 100644 (file)
@@ -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);