Skip to content
Snippets Groups Projects
Commit 17a6d640 authored by Lubos Slovak's avatar Lubos Slovak
Browse files

lowercase: Missing doxygen + Some MR fixes.

- Semantic check: missing conversion of next NSEC to lowercase
  when comparing with apex.
- Changed condition when SERVFAIL is returned (no combination
  with any possible Ext RCODE).
parent 568f5fc1
Branches
Tags
No related merge requests found
......@@ -1104,11 +1104,18 @@ void log_cyclic_errors_in_zone(err_handler_t *handler,
const knot_dname_t *next_dname = knot_nsec_next(nsec_rrs);
assert(next_dname);
knot_dname_t *lowercase = knot_dname_copy(next_dname, NULL);
if (lowercase == NULL) {
return;
}
knot_dname_to_lower(lowercase);
if (knot_dname_cmp(next_dname, zone->apex->owner) != 0) {
if (knot_dname_cmp(lowercase, zone->apex->owner) != 0) {
err_handler_handle_error(handler, zone, last_node,
ZC_ERR_NSEC_RDATA_CHAIN_NOT_CYCLIC, NULL);
}
knot_dname_free(&lowercase, NULL);
}
}
}
......@@ -304,7 +304,8 @@ int knot_rrtype_additional_needed(const uint16_t type);
*
* \param type RRSet type to check.
*
* \retval true If RDATA dnames for type
* \retval true If RDATA dnames for type should be lowercased in canonical format.
* \retval false Otherwise.
*/
bool knot_rrtype_should_be_lowercased(const uint16_t type);
......
......@@ -115,7 +115,7 @@ static int write_rdata_naptr_header(const uint8_t **src, size_t *src_avail,
assert(dst && *dst);
assert(dst_avail);
int ret = naptr_header_size(*src, *src + *src_avail);
int ret = knot_naptr_header_size(*src, *src + *src_avail);
if (ret < 0) {
return ret;
......
......@@ -172,45 +172,46 @@ int knot_rrset_rr_to_canonical(knot_rrset_t *rrset)
}
/* Convert DNAMEs in RDATA only for RFC4034 types. */
if (knot_rrtype_should_be_lowercased(rrset->type)) {
const rdata_descriptor_t *desc =
knot_get_rdata_descriptor(rrset->type);
if (desc->type_name == NULL) {
desc = knot_get_obsolete_rdata_descriptor(rrset->type);
}
if (!knot_rrtype_should_be_lowercased(rrset->type)) {
return KNOT_EOK;
}
const rdata_descriptor_t *desc = knot_get_rdata_descriptor(rrset->type);
if (desc->type_name == NULL) {
desc = knot_get_obsolete_rdata_descriptor(rrset->type);
}
knot_rdata_t *rdata = knot_rdataset_at(&rrset->rrs, 0);
uint16_t rdlen = knot_rdata_rdlen(rdata);
uint8_t *pos = knot_rdata_data(rdata);
knot_rdata_t *rdata = knot_rdataset_at(&rrset->rrs, 0);
uint16_t rdlen = knot_rdata_rdlen(rdata);
uint8_t *pos = knot_rdata_data(rdata);
/* No RDATA */
if (rdata == NULL || rdlen == 0) {
return KNOT_EOK;
}
/* No RDATA */
if (rdata == NULL || rdlen == 0) {
return KNOT_EOK;
}
/* Otherwise, whole and not malformed RDATA are expected. */
for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; ++i) {
int type = desc->block_types[i];
switch (type) {
case KNOT_RDATA_WF_COMPRESSIBLE_DNAME:
case KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME:
case KNOT_RDATA_WF_FIXED_DNAME:
ret = knot_dname_to_lower(pos);
if (ret != KNOT_EOK) {
return ret;
}
pos += knot_dname_size(pos);
break;
case KNOT_RDATA_WF_NAPTR_HEADER:
pos += naptr_header_size(pos, rdata + rdlen);
break;
case KNOT_RDATA_WF_REMAINDER:
break;
default:
/* Fixed size block */
assert(type > 0);
pos += type;
/* Otherwise, whole and not malformed RDATA are expected. */
for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; ++i) {
int type = desc->block_types[i];
switch (type) {
case KNOT_RDATA_WF_COMPRESSIBLE_DNAME:
case KNOT_RDATA_WF_DECOMPRESSIBLE_DNAME:
case KNOT_RDATA_WF_FIXED_DNAME:
ret = knot_dname_to_lower(pos);
if (ret != KNOT_EOK) {
return ret;
}
pos += knot_dname_size(pos);
break;
case KNOT_RDATA_WF_NAPTR_HEADER:
pos += knot_naptr_header_size(pos, rdata + rdlen);
break;
case KNOT_RDATA_WF_REMAINDER:
break;
default:
/* Fixed size block */
assert(type > 0);
pos += type;
}
}
......
......@@ -32,7 +32,18 @@
#include "libknot/errcode.h"
static inline int naptr_header_size(const uint8_t *naptr, const uint8_t *maxp)
/*!
* \brief Counts the size of the NAPTR RDATA before the Replacement domain name.
*
* See RFC 2915.
*
* \param naptr Wire format of NAPTR record.
* \param maxp Limit of the wire format.
*
* \retval KNOT_EMALF if the record is malformed.
* \retval Size of the RDATA before the Replacement domain name.
*/
static inline int knot_naptr_header_size(const uint8_t *naptr, const uint8_t *maxp)
{
size_t size = 0;
......@@ -42,8 +53,6 @@ static inline int naptr_header_size(const uint8_t *naptr, const uint8_t *maxp)
/* Variable fields size (flags, services, regexp) */
for (int i = 0; i < 3; i++) {
const uint8_t *len_ptr = naptr + size;
printf("Checking len_ptr = %p, maxp = %p\n",
len_ptr, maxp);
if (len_ptr >= maxp) {
return KNOT_EMALF;
}
......
......@@ -19,7 +19,7 @@ master.gen_confile()
t.start()
t.sleep(4)
master.zone_wait(zone)
master.flush()
......
......@@ -15,7 +15,7 @@ t.start()
knot.zones_wait(zone)
# Request AXFR from both Knot
# Request AXFR from Knot
resp = knot.dig("duplicates.", "AXFR")
# If Knot has not properly handled the case, there will be some redundant record
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment