diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c index 7aeeeec5701b045d47c4d3c3c634d55a1f12b6de..287b34e512368395fdda2182a612f1a8acccac5d 100644 --- a/src/libknot/nameserver/name-server.c +++ b/src/libknot/nameserver/name-server.c @@ -498,21 +498,26 @@ dbg_ns_exec_verb( dbg_ns_detail(" Type: %u\n", knot_rrset_type(rrset)); - ret = ns_check_wildcard(name, resp, &rrset); - if (ret != KNOT_EOK) { - dbg_ns("Failed to process wildcard.\n"); - break; - } + if (knot_rrset_rdata_rr_count(rrset) > 0 + || knot_rrset_type(rrset) == KNOT_RRTYPE_APL) { - ret = knot_response_add_rrset_answer(resp, rrset, 1, - 0, 1); - if (ret != KNOT_EOK) { - dbg_ns("Failed add Answer RRSet: %s\n", - knot_strerror(ret)); - break; - } + ret = ns_check_wildcard(name, resp, &rrset); + if (ret != KNOT_EOK) { + dbg_ns("Failed to process wildcard.\n"); + break; + } - *added += 1; + ret = knot_response_add_rrset_answer(resp, + rrset, 1, + 0, 1); + if (ret != KNOT_EOK) { + dbg_ns("Failed add Answer RRSet: %s\n", + knot_strerror(ret)); + break; + } + + *added += 1; + } ret = ns_add_rrsigs(rrset, resp, name, knot_response_add_rrset_answer, 1); @@ -1740,7 +1745,7 @@ static inline int ns_referral(const knot_node_t *node, knot_rrset_t *ds_rrset = knot_node_get_rrset(node, KNOT_RRTYPE_DS); - if (ds_rrset) { + if (ds_rrset && knot_rrset_rdata_rr_count(ds_rrset) > 0) { ret = knot_response_add_rrset_answer(resp, ds_rrset, 1, 0, 1); if (ret == KNOT_EOK && DNSSEC_ENABLED @@ -2207,7 +2212,8 @@ have_node: // DNAME? knot_rrset_t *dname_rrset = knot_node_get_rrset( closest_encloser, KNOT_RRTYPE_DNAME); - if (dname_rrset != NULL) { + if (dname_rrset != NULL + && knot_rrset_rdata_rr_count(dname_rrset) > 0) { ret = ns_process_dname(dname_rrset, &qname, resp); knot_response_set_aa(resp); @@ -2683,8 +2689,14 @@ rrset: continue; } - ret = knot_response_add_rrset_answer(params->xfr->response, - rrset, 0, 0, 0); + // Do not put empty RRSet + if (knot_rrset_rdata_rr_count(rrset) <= 0) { + rrset = knot_rrset_get_rrsigs(rrset); + goto rrsigs; + } + + ret = knot_response_add_rrset_answer( + params->xfr->response, rrset, 0, 0, 0); if (ret == KNOT_ESPACE) { // TODO: send the packet and clean the structure @@ -2841,8 +2853,15 @@ static int ns_axfr_from_zone(knot_zone_contents_t *zone, knot_ns_xfr_t *xfr) static int ns_ixfr_put_rrset(knot_ns_xfr_t *xfr, knot_rrset_t *rrset) { - int res = knot_response_add_rrset_answer(xfr->response, rrset, - 0, 0, 0); + int res; + + if (knot_rrset_rdata_rr_count(rrset) > 0) { + res = knot_response_add_rrset_answer(xfr->response, rrset, + 0, 0, 0); + } else { + res = KNOT_ENORRSET; + } + if (res == KNOT_ESPACE) { knot_response_set_rcode(xfr->response, KNOT_RCODE_NOERROR); /*! \todo Probably rename the function. */ @@ -2853,7 +2872,7 @@ static int ns_ixfr_put_rrset(knot_ns_xfr_t *xfr, knot_rrset_t *rrset) } if (res != KNOT_EOK) { - dbg_ns("Error putting origin SOA to IXFR reply: %s\n", + dbg_ns("Error putting RR to IXFR reply: %s\n", knot_strerror(res)); /*! \todo Probably send back AXFR instead. */ knot_response_set_rcode(xfr->response,