From: Štěpán Balážik Date: Wed, 20 Jan 2021 10:12:12 +0000 (+0100) Subject: iterate: interpret empty FORMERR answers correctly X-Git-Tag: v5.3.0~15^2~7 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=8d42032468e47645307edc245d3ba4e0c3b42736;p=thirdparty%2Fknot-resolver.git iterate: interpret empty FORMERR answers correctly Previously a 12B reply with FORMERR would be treated as malformed creating a need for a workaround (switching off EDNS for every malformed answer). --- diff --git a/lib/layer/iterate.c b/lib/layer/iterate.c index 668c0a64a..bf3bb97c4 100644 --- a/lib/layer/iterate.c +++ b/lib/layer/iterate.c @@ -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;