]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
iterate: interpret empty FORMERR answers correctly
authorŠtěpán Balážik <stepan.balazik@nic.cz>
Wed, 20 Jan 2021 10:12:12 +0000 (11:12 +0100)
committerŠtěpán Balážik <stepan.balazik@nic.cz>
Mon, 25 Jan 2021 14:42:55 +0000 (15:42 +0100)
Previously a 12B reply with FORMERR would be treated as malformed
creating a need for a workaround (switching off EDNS for every malformed
answer).

lib/layer/iterate.c

index 668c0a64a35094011959ddbefa256aaa2b28aa69..bf3bb97c4bf5948c9305ae989c5e835a2bbf6619 100644 (file)
@@ -1021,6 +1021,13 @@ static int resolve(kr_layer_t *ctx, knot_pkt_t *pkt)
        } else
 #endif
        if (pkt->parsed <= KNOT_WIRE_HEADER_SIZE) {
+               if (pkt->parsed == KNOT_WIRE_HEADER_SIZE && knot_wire_get_rcode(pkt->wire) == KNOT_RCODE_FORMERR) {
+                       /* This is a special case where we get valid header with FORMERROR and nothing else.
+                        * This happens on some authoritatives which don't support EDNS and don't
+                        * bother copying the SECTION QUESTION. */
+                       query->server_selection.error(query, req->upstream.transport, KR_SELECTION_FORMERROR);
+                       return KR_STATE_FAIL;
+               }
                VERBOSE_MSG("<= malformed response (parsed %d)\n", (int)pkt->parsed);
                query->server_selection.error(query, req->upstream.transport, KR_SELECTION_MALFORMED);
                return KR_STATE_FAIL;