zscanner: remove block indexing

refs #155
This commit is contained in:
Daniel Salzman 2013-08-27 16:00:08 +02:00
parent 0030706ac0
commit fcc6fcc6c2
7 changed files with 4396 additions and 4677 deletions

File diff suppressed because it is too large Load diff

View file

@ -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]
*/
};

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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_
/*! @} */

View file

@ -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]);
}
}
}

View file

@ -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_
/*! @} */