.PHONY: all install check clean doc info lint
# Dependencies
-KNOT_MINVER := 2.6.4
+KNOT_MINVER := 2.6.7
$(eval $(call find_lib,libknot,$(KNOT_MINVER),yes))
$(eval $(call find_lib,libdnssec,$(KNOT_MINVER),yes))
$(eval $(call find_lib,libzscanner,$(KNOT_MINVER),yes))
/* Parse query packet. */
int ret = knot_pkt_parse(query, 0);
- if (ret != KNOT_EOK) {
- return kr_error(EPROTO); /* Ignore malformed query. */
- }
-
- /* Check if at least header is parsed. */
- if (query->parsed < query->size) {
- return kr_error(EMSGSIZE);
+ if (ret == KNOT_ETRAIL) {
+ /* Extra data after message end. */
+ ret = kr_error(EMSGSIZE);
+ } else if (ret != KNOT_EOK) {
+ /* Malformed query. */
+ ret = kr_error(EPROTO);
+ } else {
+ ret = kr_ok();
}
- return kr_ok();
+ return ret;
}
static struct qr_task* find_task(const struct session *session, uint16_t msg_id)
* or resume if this is subrequest */
struct qr_task *task = NULL;
if (!session->outgoing) { /* request from a client */
- /* Ignore badly formed queries or responses. */
+ /* Ignore badly formed queries. */
if (!query || ret != 0 || knot_wire_get_qr(query->wire)) {
if (query) worker->stats.dropped += 1;
return kr_error(EILSEQ);
}
addr = NULL;
} else if (query) { /* response from upstream */
+ if ((ret != kr_ok() && ret != kr_error(EMSGSIZE)) ||
+ !knot_wire_get_qr(query->wire)) {
+ /* Ignore badly formed responses. */
+ return kr_error(EILSEQ);
+ }
task = find_task(session, knot_wire_get_id(query->wire));
if (task == NULL) {
return kr_error(ENOENT);