diff --git a/src/libknot/nameserver/axfr.c b/src/libknot/nameserver/axfr.c index 17868b808ce88449eef67eb71ac3b1081b8a21ce..4fe0e820efd7c30b6847bbb09081b417c0ee3471 100644 --- a/src/libknot/nameserver/axfr.c +++ b/src/libknot/nameserver/axfr.c @@ -54,8 +54,9 @@ static int answer_put_nodes(knot_pkt_t *pkt, struct axfr_proc *state) { /* Put responses. */ int ret = KNOT_EOK; + knot_node_t *node = NULL; while(!hattrie_iter_finished(state->i)) { - knot_node_t *node = (knot_node_t *)*hattrie_iter_val(state->i); + node = (knot_node_t *)*hattrie_iter_val(state->i); ret = put_rrsets(pkt, node, state); if (ret != KNOT_EOK) { break; @@ -142,7 +143,6 @@ int axfr_answer(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *qdata qdata->rcode = KNOT_RCODE_NOTAUTH; return NS_PROC_FAIL; default: - qdata->rcode = KNOT_RCODE_SERVFAIL; return NS_PROC_FAIL; } @@ -155,7 +155,6 @@ int axfr_answer(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *qdata break; default: /* Generic error. */ dbg_ns("%s: answered with ret = %s\n", __func__, knot_strerror(ret)); - qdata->rcode = KNOT_RCODE_SERVFAIL; return NS_PROC_FAIL; } diff --git a/src/libknot/nameserver/internet.c b/src/libknot/nameserver/internet.c index 33ed7279a2a6b813641950a070bb9bf36ee4486c..fed072c8075e39245ee1184c2a42850a0ec5e68f 100644 --- a/src/libknot/nameserver/internet.c +++ b/src/libknot/nameserver/internet.c @@ -51,7 +51,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query /* Put to wildcard node list. */ if (ptrlist_add(&qdata->wildcards, cname_node, qdata->mm) == NULL) { - qdata->rcode = KNOT_RCODE_SERVFAIL; return ERROR; } @@ -74,7 +73,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query if (rr_to_add != cname_rr) { knot_rrset_deep_free(&rr_to_add, 1); } - qdata->rcode = KNOT_RCODE_SERVFAIL; return ERROR; } else { /* Check if RR count increased. */ @@ -91,7 +89,6 @@ static int follow_cname(knot_pkt_t *pkt, const knot_dname_t **name, struct query if (ret != KNOT_EOK) { dbg_ns("%s: couldn't add rrsigs for CNAME RRSet %p\n", __func__, cname_rr); - qdata->rcode = KNOT_RCODE_SERVFAIL; return ERROR; } @@ -150,7 +147,6 @@ static int name_found(knot_pkt_t *pkt, const knot_dname_t **name, && (qtype == KNOT_RRTYPE_SOA || qtype == KNOT_RRTYPE_NS)) { ret = ns_add_dnskey(qdata->node, pkt); if (ret != KNOT_EOK) { - qdata->rcode = KNOT_RCODE_SERVFAIL; return ERROR; } } @@ -185,7 +181,6 @@ static int name_not_found(knot_pkt_t *pkt, const knot_dname_t **name, dbg_ns("%s: solving DNAME for name %p\n", __func__, *name); int ret = ns_process_dname(dname_rrset, name, pkt); if (ret != KNOT_EOK) { - qdata->rcode = KNOT_RCODE_SERVFAIL; return ERROR; } @@ -272,7 +267,6 @@ static int solve_authority(int state, const knot_dname_t **qname, dbg_ns("%s: invalid state after qname processing = %d\n", __func__, state); assert(0); - qdata->rcode = KNOT_RCODE_SERVFAIL; break; } @@ -294,7 +288,6 @@ int internet_answer(knot_pkt_t *response, struct query_data *qdata) qdata->rcode = KNOT_RCODE_REFUSED; return NS_PROC_FAIL; default: - qdata->rcode = KNOT_RCODE_SERVFAIL; return NS_PROC_FAIL; } @@ -395,7 +388,6 @@ int internet_notify(knot_pkt_t *pkt, knot_nameserver_t *ns, struct query_data *q qdata->rcode = KNOT_RCODE_NOTAUTH; return NS_PROC_FAIL; default: - qdata->rcode = KNOT_RCODE_SERVFAIL; return NS_PROC_FAIL; } diff --git a/src/libknot/nameserver/ns_proc_query.c b/src/libknot/nameserver/ns_proc_query.c index cf38b2a7f571b9d9f9a63a731e3d8826f8b187cc..3930eadb9cf3465982bb81667824bdf848200642 100644 --- a/src/libknot/nameserver/ns_proc_query.c +++ b/src/libknot/nameserver/ns_proc_query.c @@ -150,6 +150,11 @@ int ns_proc_query_out(knot_pkt_t *pkt, ns_proc_context_t *ctx) break; } + /* Default RCODE is SERVFAIL if not specified otherwise. */ + if (next_state == NS_PROC_FAIL && data->rcode == KNOT_RCODE_NOERROR) { + data->rcode = KNOT_RCODE_SERVFAIL; + } + rcu_read_unlock(); return next_state; } @@ -218,8 +223,6 @@ int query_internet(knot_pkt_t *pkt, ns_proc_context_t *ctx) break; default: assert(0); /* Should be caught earlier. */ - data->rcode = KNOT_RCODE_SERVFAIL; - next_state = KNOT_ERROR; break; }