mirror of
https://gitlab.nic.cz/knot/knot-dns.git
synced 2026-05-28 04:02:31 -04:00
parent
0030706ac0
commit
fcc6fcc6c2
7 changed files with 4396 additions and 4677 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -204,10 +204,6 @@ struct scanner {
|
|||
uint8_t r_data[MAX_RDATA_LENGTH];
|
||||
/*! Length of the current rdata. */
|
||||
uint32_t r_data_length;
|
||||
/*! Indexes of the current rdata blocks. */
|
||||
uint16_t r_data_blocks[MAX_RDATA_ITEMS];
|
||||
/*! Number or the current rdata blocks. */
|
||||
uint32_t r_data_blocks_count;
|
||||
|
||||
/*
|
||||
* Example: a. IN 60 MX 1 b.
|
||||
|
|
@ -219,8 +215,6 @@ struct scanner {
|
|||
* r_type = 15
|
||||
* r_data = 0001016200
|
||||
* r_data_length = 5
|
||||
* r_data_blocks_count = 2
|
||||
* r_data_blocks = [0, 2, 5]
|
||||
*/
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -215,14 +215,6 @@
|
|||
fhold; fgoto err_line;
|
||||
}
|
||||
}
|
||||
|
||||
action _separate {
|
||||
s->r_data_blocks[++(s->r_data_blocks_count)] =
|
||||
rdata_tail - s->r_data;
|
||||
}
|
||||
|
||||
# Rdata blocks dividing.
|
||||
blk_sep = zlen >_separate;
|
||||
# END
|
||||
|
||||
# BEGIN - Owner processing
|
||||
|
|
@ -435,7 +427,7 @@
|
|||
|
||||
time_block = (number . time_unit) >_time_block_init %_time_block_exit;
|
||||
|
||||
# Time is either a number or a sequence of time blocks (1w1h1m)
|
||||
# Time is either a number or a sequence of time blocks (1w1h1m).
|
||||
time = (number . (time_unit . (time_block)*)?) $!_number_error;
|
||||
|
||||
time32 = time %_num32_write;
|
||||
|
|
@ -908,12 +900,6 @@
|
|||
SCANNER_WARNING(ZSCANNER_EBAD_RDATA_LENGTH);
|
||||
fhold; fgoto err_line;
|
||||
}
|
||||
|
||||
ret = find_rdata_blocks(s);
|
||||
if (ret != ZSCANNER_OK) {
|
||||
SCANNER_WARNING(ret);
|
||||
fhold; fgoto err_line;
|
||||
}
|
||||
}
|
||||
|
||||
action _type_data_error {
|
||||
|
|
@ -1521,7 +1507,7 @@
|
|||
}
|
||||
}
|
||||
action _eui_sep_error {
|
||||
SCANNER_WARNING(ZSCANNER_EBAD_CHAR_DASH);
|
||||
SCANNER_WARNING(ZSCANNER_EBAD_CHAR_DASH);
|
||||
fhold; fgoto err_line;
|
||||
}
|
||||
|
||||
|
|
@ -1606,8 +1592,6 @@
|
|||
|
||||
# BEGIN - Rdata processing
|
||||
action _r_data_init {
|
||||
s->r_data_blocks[0] = 0;
|
||||
s->r_data_blocks_count = 0;
|
||||
rdata_tail = s->r_data;
|
||||
}
|
||||
action _r_data_error {
|
||||
|
|
@ -1624,8 +1608,8 @@
|
|||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_soa :=
|
||||
(r_dname . blk_sep . sep . r_dname . blk_sep . sep . num32 .
|
||||
sep . time32 . sep . time32 . sep . time32 . sep . time32)
|
||||
(r_dname . sep . r_dname . sep . num32 . sep . time32 .
|
||||
sep . time32 . sep . time32 . sep . time32)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_hinfo :=
|
||||
|
|
@ -1633,11 +1617,11 @@
|
|||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_minfo :=
|
||||
(r_dname . blk_sep . sep . r_dname)
|
||||
(r_dname . sep . r_dname)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_mx :=
|
||||
(num16 . blk_sep . sep . r_dname)
|
||||
(num16 . sep . r_dname)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_txt :=
|
||||
|
|
@ -1653,12 +1637,12 @@
|
|||
$!_r_data_error %_ret . end_wchar;
|
||||
|
||||
r_data_srv :=
|
||||
(num16 . sep . num16 . sep . num16 . blk_sep . sep . r_dname)
|
||||
(num16 . sep . num16 . sep . num16 . sep . r_dname)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_naptr :=
|
||||
(num16 . sep . num16 . sep . text_string . sep . text_string .
|
||||
sep . text_string . blk_sep . sep . r_dname)
|
||||
sep . text_string . sep . r_dname)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_cert :=
|
||||
|
|
@ -1683,12 +1667,12 @@
|
|||
|
||||
r_data_rrsig :=
|
||||
(type_num . sep . dns_alg . sep . num8 . sep . num32 . sep .
|
||||
timestamp . sep . timestamp . sep . num16 . blk_sep . sep .
|
||||
r_dname . blk_sep . sep . base64)
|
||||
timestamp . sep . timestamp . sep . num16 . sep . r_dname .
|
||||
sep . base64)
|
||||
$!_r_data_error %_ret . end_wchar;
|
||||
|
||||
r_data_nsec :=
|
||||
(r_dname . blk_sep . bitmap)
|
||||
(r_dname . bitmap)
|
||||
$!_r_data_error %_ret . all_wchar;
|
||||
|
||||
r_data_dnskey :=
|
||||
|
|
@ -1849,15 +1833,10 @@
|
|||
}
|
||||
}
|
||||
|
||||
action _text_r_data_exit {
|
||||
s->r_data_blocks[++(s->r_data_blocks_count)] =
|
||||
(uint16_t)(rdata_tail - s->r_data);
|
||||
}
|
||||
|
||||
# rdata can be in text or hex format with leading "\#" string
|
||||
# rdata can be in text or hex format with leading "\#" string.
|
||||
r_data =
|
||||
( sep . ^('\\' | all_wchar) $_text_r_data %_text_r_data_exit
|
||||
| sep . '\\' . ^'#' ${ fhold; } $_text_r_data %_text_r_data_exit
|
||||
( sep . ^('\\' | all_wchar) $_text_r_data
|
||||
| sep . '\\' . ^'#' ${ fhold; } $_text_r_data
|
||||
| sep . '\\' . '#' $_hex_r_data # Hex format.
|
||||
| sep? . end_wchar $_text_r_data # Empty rdata.
|
||||
) >_r_data_init $!_r_data_error;
|
||||
|
|
|
|||
|
|
@ -822,162 +822,3 @@ uint8_t loc64to8(uint64_t number)
|
|||
// First 4 bits are mantisa, second 4 bits are exponent.
|
||||
return ((uint8_t)number << 4) + (exponent & 15);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns domain name length in wire-format.
|
||||
*
|
||||
* \param data Data array.
|
||||
* \param data_len Length of data array.
|
||||
*
|
||||
* \retval >0 if success.
|
||||
* \retval 0 if error.
|
||||
*/
|
||||
static uint32_t get_dname_length(const uint8_t *data,
|
||||
const uint32_t data_len)
|
||||
{
|
||||
uint8_t label_len = data[0];
|
||||
uint32_t dname_len = 0;
|
||||
|
||||
while (label_len > 0) {
|
||||
// Label overflow check.
|
||||
if (label_len > MAX_LABEL_LENGTH) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
dname_len += 1 + label_len;
|
||||
|
||||
// Data overflow check.
|
||||
if (dname_len > data_len) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
label_len = data[dname_len];
|
||||
}
|
||||
|
||||
dname_len++; // Last label length byte.
|
||||
|
||||
// Dname overflow check.
|
||||
if (dname_len <= MAX_DNAME_LENGTH) {
|
||||
return dname_len;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns length of the leading NAPTR block in wire-format.
|
||||
*
|
||||
* \param data Data array.
|
||||
* \param data_len Length of data array.
|
||||
*
|
||||
* \retval >0 if success.
|
||||
* \retval 0 if error.
|
||||
*/
|
||||
static uint32_t get_naptr_header_length(const uint8_t *data,
|
||||
const uint32_t data_len)
|
||||
{
|
||||
uint32_t naptr_len = 0;
|
||||
|
||||
// 2B order + 2B preference.
|
||||
naptr_len += 2 + 2;
|
||||
|
||||
// Flags - text string with forward 1B length.
|
||||
naptr_len += data[naptr_len] + 1;
|
||||
|
||||
// Services - text string with forward 1B length.
|
||||
naptr_len += data[naptr_len] + 1;
|
||||
|
||||
// Regexp - text string with forward 1B length.
|
||||
naptr_len += data[naptr_len] + 1;
|
||||
|
||||
// Data overflow check.
|
||||
if (naptr_len <= data_len) {
|
||||
return naptr_len;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns block length in wire-format.
|
||||
*
|
||||
* \param data Data array.
|
||||
* \param data_len Length of data array.
|
||||
* \param offset Start of the block in data array.
|
||||
* \param type Record type.
|
||||
*
|
||||
* \retval >=0 if success.
|
||||
* \retval <0 if error.
|
||||
*/
|
||||
static int32_t get_block_length(const uint8_t *data,
|
||||
const uint32_t data_len,
|
||||
const uint32_t offset,
|
||||
const int type)
|
||||
{
|
||||
uint32_t ret;
|
||||
|
||||
switch (type) {
|
||||
case KNOT_RDATA_WF_COMPRESSED_DNAME:
|
||||
case KNOT_RDATA_WF_UNCOMPRESSED_DNAME:
|
||||
ret = get_dname_length(data + offset, data_len - offset);
|
||||
|
||||
if (ret > 0) {
|
||||
return ret;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
case KNOT_RDATA_WF_NAPTR_HEADER:
|
||||
ret = get_naptr_header_length(data + offset, data_len - offset);
|
||||
|
||||
if (ret > 0) {
|
||||
return ret;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
case KNOT_RDATA_WF_REMAINDER:
|
||||
return data_len - offset;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int find_rdata_blocks(scanner_t *s)
|
||||
{
|
||||
int32_t ret;
|
||||
uint32_t position = 0;
|
||||
|
||||
// Initialization of block items.
|
||||
s->r_data_blocks_count = 0;
|
||||
s->r_data_blocks[0] = 0;
|
||||
|
||||
// Getting appropriate descriptor array.
|
||||
const rdata_descriptor_t *descriptor = get_rdata_descriptor(s->r_type);
|
||||
const int *type = descriptor->block_types;
|
||||
|
||||
// Loop over descriptor array.
|
||||
while (*type != KNOT_RDATA_WF_END) {
|
||||
if (*type > KNOT_RDATA_WF_END) {
|
||||
position += *type;
|
||||
} else {
|
||||
ret = get_block_length(s->r_data,
|
||||
s->r_data_length,
|
||||
position,
|
||||
*type);
|
||||
if (ret < 0) {
|
||||
return ZSCANNER_EUNKNOWN_BLOCK;
|
||||
}
|
||||
|
||||
position += ret;
|
||||
}
|
||||
s->r_data_blocks[++(s->r_data_blocks_count)] = position;
|
||||
type++;
|
||||
}
|
||||
|
||||
// Checking processed rdata length.
|
||||
if (s->r_data_blocks[s->r_data_blocks_count] != s->r_data_length) {
|
||||
return ZSCANNER_EBAD_HEX_RDATA;
|
||||
}
|
||||
else {
|
||||
return ZSCANNER_OK;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,16 +112,6 @@ void wire_dname_to_str(const uint8_t *data,
|
|||
*/
|
||||
uint8_t loc64to8(uint64_t number);
|
||||
|
||||
/*!
|
||||
* \brief Finds rdata blocks according to rdata descriptors.
|
||||
*
|
||||
* \param s Zone scanner.
|
||||
*
|
||||
* \retval ZSCANNER_OK if success.
|
||||
* \retval error_code if error.
|
||||
*/
|
||||
int find_rdata_blocks(scanner_t *s);
|
||||
|
||||
#endif // _ZSCANNER__SCANNER_FUNCTIONS_H_
|
||||
|
||||
/*! @} */
|
||||
|
|
|
|||
|
|
@ -60,34 +60,26 @@ void debug_process_error(const scanner_t *s)
|
|||
|
||||
void debug_process_record(const scanner_t *s)
|
||||
{
|
||||
uint32_t block, block_length, i;
|
||||
uint32_t i;
|
||||
|
||||
char rclass[32];
|
||||
char rtype[32];
|
||||
|
||||
if (knot_rrclass_to_string(s->r_class, rclass, sizeof(rclass)) > 0 &&
|
||||
knot_rrtype_to_string(s->r_type, rtype, sizeof(rtype)) > 0) {
|
||||
printf("LINE(%03"PRIu64") %s %u %*s ",
|
||||
printf("LINE(%03"PRIu64") %s %6u %*s ",
|
||||
s->line_counter, rclass, s->r_ttl, 5, rtype);
|
||||
} else {
|
||||
printf("LINE(%03"PRIu64") %u %u %*u ",
|
||||
printf("LINE(%03"PRIu64") %u %6u %*u ",
|
||||
s->line_counter, s->r_class, s->r_ttl, 5, s->r_type);
|
||||
}
|
||||
|
||||
print_wire_dname(s->r_owner, s->r_owner_length);
|
||||
|
||||
printf(" #%u/%uB:", s->r_data_blocks_count, s->r_data_length);
|
||||
printf(" \\# %u ", s->r_data_length);
|
||||
|
||||
for (block = 1; block <= s->r_data_blocks_count; block++) {
|
||||
block_length =
|
||||
s->r_data_blocks[block] - s->r_data_blocks[block - 1];
|
||||
printf(" (%u)", block_length);
|
||||
|
||||
for (i = s->r_data_blocks[block - 1];
|
||||
i < s->r_data_blocks[block];
|
||||
i++) {
|
||||
printf("%02X", (s->r_data)[i]);
|
||||
}
|
||||
for (i = 0; i < s->r_data_length; i++) {
|
||||
printf("%02X", (s->r_data)[i]);
|
||||
}
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
|
|
@ -105,7 +97,7 @@ void test_process_error(const scanner_t *s)
|
|||
|
||||
void test_process_record(const scanner_t *s)
|
||||
{
|
||||
uint32_t block, i;
|
||||
uint32_t i;
|
||||
|
||||
printf("OWNER=");
|
||||
for (i = 0; i < s->r_owner_length; i++) {
|
||||
|
|
@ -116,30 +108,9 @@ void test_process_record(const scanner_t *s)
|
|||
printf("RRTTL=%08X\n", s->r_ttl);
|
||||
printf("RTYPE=%04X\n", s->r_type);
|
||||
printf("RDATA=");
|
||||
for (block = 1; block <= s->r_data_blocks_count; block++) {
|
||||
if (block > 1) {
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
for (i = s->r_data_blocks[block - 1];
|
||||
i < s->r_data_blocks[block];
|
||||
i++) {
|
||||
printf("%02X", (s->r_data)[i]);
|
||||
}
|
||||
for (i = 0; i < s->r_data_length; i++) {
|
||||
printf("%02X", (s->r_data)[i]);
|
||||
}
|
||||
printf("\n%s", separator);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void dump_rdata(const scanner_t *s)
|
||||
{
|
||||
uint32_t block, i;
|
||||
|
||||
for (block = 1; block <= s->r_data_blocks_count; block++) {
|
||||
for (i = s->r_data_blocks[block - 1];
|
||||
i < s->r_data_blocks[block];
|
||||
i++) {
|
||||
printf("%c", (s->r_data)[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,8 +37,6 @@ void test_process_error(const scanner_t *scanner);
|
|||
|
||||
void test_process_record(const scanner_t *scanner);
|
||||
|
||||
void dump_rdata(const scanner_t *scanner);
|
||||
|
||||
#endif // _ZSCANNER__TEST_FUNCTIONS_H_
|
||||
|
||||
/*! @} */
|
||||
|
|
|
|||
Loading…
Reference in a new issue