summaryrefslogtreecommitdiff
path: root/src/libknot
diff options
context:
space:
mode:
Diffstat (limited to 'src/libknot')
-rw-r--r--src/libknot/nameserver/name-server.c22
-rw-r--r--src/libknot/nameserver/name-server.h5
-rw-r--r--src/libknot/rrset-dump.c4
-rw-r--r--src/libknot/zone/zone-contents.c6
4 files changed, 24 insertions, 13 deletions
diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c
index 4a95240..ee956e7 100644
--- a/src/libknot/nameserver/name-server.c
+++ b/src/libknot/nameserver/name-server.c
@@ -1753,7 +1753,7 @@ static inline int ns_referral(const knot_node_t *node,
&& knot_query_dnssec_requested(
knot_packet_query(resp))) {
ret = ns_add_rrsigs(ds_rrset, resp, node->owner,
- knot_response_add_rrset_authority,
+ knot_response_add_rrset_answer,
1);
}
} else {
@@ -1919,7 +1919,6 @@ static int ns_answer_from_node(const knot_node_t *node,
}
}
} else { // else put authority NS
- assert(previous == NULL);
assert(closest_encloser == knot_node_parent(node)
|| !knot_dname_is_wildcard(knot_node_owner(node))
|| knot_dname_compare(qname, knot_node_owner(node)) == 0);
@@ -2141,14 +2140,19 @@ static int ns_answer_from_zone(const knot_zone_contents_t *zone,
uint16_t qtype = knot_packet_qtype(resp);
search:
- find_ret = knot_zone_contents_find_dname(zone, qname, &node,
- &closest_encloser, &previous);
-// node = knot_node_current(node);
-// closest_encloser = knot_node_current(closest_encloser);
-// previous = knot_node_current(previous);
- previous = NULL; // TODO REVIEW LS
+ // Searching for a name directly is faster than when we need previous dname
+ node = knot_zone_contents_find_node(zone, qname);
+ if (node != NULL) {
+ // If node is found, closest_encloser is equal to node itself
+ closest_encloser = node;
+ find_ret = KNOT_ZONE_NAME_FOUND;
+ } else {
+ // We need previous and closest encloser, full search has to be done
+ find_ret = knot_zone_contents_find_dname(zone, qname, &node,
+ &closest_encloser, &previous);
if (find_ret == KNOT_EINVAL) {
- return NS_ERR_SERVFAIL;
+ return NS_ERR_SERVFAIL;
+ }
}
dbg_ns_exec_verb(
diff --git a/src/libknot/nameserver/name-server.h b/src/libknot/nameserver/name-server.h
index 58ea212..6574539 100644
--- a/src/libknot/nameserver/name-server.h
+++ b/src/libknot/nameserver/name-server.h
@@ -159,7 +159,8 @@ static const size_t KNOT_NS_TSIG_DATA_MAX_SIZE = 100 * 64 * 1024;
enum knot_ns_xfr_flag_t {
XFR_FLAG_TCP = 1 << 0, /*!< XFR request is on TCP. */
XFR_FLAG_UDP = 1 << 1, /*!< XFR request is on UDP. */
- XFR_FLAG_AXFR_FINISHED = 1 << 2 /*!< Transfer is finished. */
+ XFR_FLAG_AXFR_FINISHED = 1 << 2, /*!< Transfer is finished. */
+ XFR_FLAG_CONNECTING = 1 << 3 /*!< In connecting phase. */
};
typedef enum knot_ns_transport {
@@ -173,8 +174,8 @@ typedef enum knot_ns_transport {
typedef enum knot_ns_xfr_type_t {
/* DNS events. */
XFR_TYPE_AIN = 0, /*!< AXFR-IN request (start transfer). */
- XFR_TYPE_AOUT, /*!< AXFR-OUT request (incoming transfer). */
XFR_TYPE_IIN, /*!< IXFR-IN request (start transfer). */
+ XFR_TYPE_AOUT, /*!< AXFR-OUT request (incoming transfer). */
XFR_TYPE_IOUT, /*!< IXFR-OUT request (incoming transfer). */
XFR_TYPE_SOA, /*!< Pending SOA request. */
XFR_TYPE_NOTIFY, /*!< Pending NOTIFY query. */
diff --git a/src/libknot/rrset-dump.c b/src/libknot/rrset-dump.c
index e22a629..c8c7fe7 100644
--- a/src/libknot/rrset-dump.c
+++ b/src/libknot/rrset-dump.c
@@ -549,9 +549,9 @@ static void wire_text_to_str(rrset_dump_params_t *p)
// Loop over all characters.
for (size_t i = 0; i < in_len; i++) {
- char ch = (char)(p->in)[i];
+ uint8_t ch = p->in[i];
- if (isprint((unsigned char)(ch)) != 0) {
+ if (isprint(ch) != 0) {
// For special character print leading slash.
if (ch == '\\' || ch == '"') {
dump_string(p, "\\");
diff --git a/src/libknot/zone/zone-contents.c b/src/libknot/zone/zone-contents.c
index ff1a1d4..fbf4ab3 100644
--- a/src/libknot/zone/zone-contents.c
+++ b/src/libknot/zone/zone-contents.c
@@ -2515,6 +2515,12 @@ int knot_zone_contents_integrity_check(const knot_zone_contents_t *contents)
data.children = 0;
data.contents = contents;
+ if (contents == NULL) {
+ log_zone_warning("Zone to be integrity-checked does "
+ "not exist. Skipping...\n");
+ return 1;
+ }
+
int ret = knot_zone_contents_tree_apply_inorder(
(knot_zone_contents_t *)contents,
knot_zc_integrity_check_node, (void *)&data);