Skip to content

Commit 3e580af

Browse files
committed
Improve throughput for parsing domain names
Fixes NLnetLabs#66.
1 parent 0cdb55f commit 3e580af

File tree

8 files changed

+250
-168
lines changed

8 files changed

+250
-168
lines changed

src/fallback/name.h

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,24 @@
1212
zone_nonnull_all
1313
static zone_really_inline int32_t scan_name(
1414
zone_parser_t *parser,
15-
const zone_type_info_t *type,
16-
const zone_field_info_t *field,
17-
const uint8_t delimiters[256],
1815
const token_t *token,
1916
uint8_t octets[255 + ZONE_BLOCK_SIZE],
20-
size_t *length)
17+
size_t *lengthp)
2118
{
2219
uint8_t *l = octets, *b = octets + 1;
2320
const uint8_t *bs = octets + 255;
24-
const char *s = token->data;
21+
const char *s = token->data, *se = token->data + token->length;
22+
23+
(void)parser;
2524

2625
l[0] = 0;
2726

2827
if (s[0] == '.') {
29-
if (delimiters[(uint8_t)s[1]] == token->code)
30-
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
31-
*length = 1;
28+
if (token->length > 1)
29+
return -1;
30+
//if (delimiters[(uint8_t)s[1]] == token->code)
31+
// SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
32+
*lengthp = 1;
3233
return 0;
3334
}
3435

@@ -46,20 +47,23 @@ static zone_really_inline int32_t scan_name(
4647
d[1] = (uint8_t)s[2] - '0';
4748
d[2] = (uint8_t)s[3] - '0';
4849
if (d[1] > m || d[2] > m)
49-
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
50+
return -1;
51+
//SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
5052
b[0] = d[0] * 100 + d[1] * 10 + d[0];
5153
b += 1; s += 4;
5254
}
5355
} else if (c == '.') {
5456
if ((b - 1) - l > 63 || (b - 1) - l == 0)
55-
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
57+
return -1;//SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
5658
l[0] = (uint8_t)((b - 1) - l);
5759
l = b;
5860
l[0] = 0;
5961
b += 1; s += 1;
60-
} else if (delimiters[c] != token->code) {
62+
} else if (s == se) {
63+
//if (delimiters[c] != token->code) {
6164
if ((b - 1) - l > 63)
62-
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
65+
return -1;
66+
//SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
6367
l[0] = (uint8_t)((b - 1) - l);
6468
break;
6569
} else {
@@ -68,35 +72,11 @@ static zone_really_inline int32_t scan_name(
6872
}
6973
}
7074

71-
if (delimiters[(uint8_t)*s] == token->code)
72-
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
73-
74-
*length = (size_t)(b - octets);
75-
return l[0] == 0 ? 0 : ZONE_NAME;
76-
}
77-
78-
zone_nonnull_all
79-
static zone_really_inline int32_t scan_contiguous_name(
80-
zone_parser_t *parser,
81-
const zone_type_info_t *type,
82-
const zone_field_info_t *field,
83-
const token_t *token,
84-
uint8_t octets[255 + ZONE_BLOCK_SIZE],
85-
size_t *length)
86-
{
87-
return scan_name(parser, type, field, contiguous, token, octets, length);
88-
}
75+
if (s != se || b > bs)//delimiters[(uint8_t)*s] == token->code)
76+
return -1;//SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
8977

90-
zone_nonnull_all
91-
static zone_really_inline int32_t scan_quoted_name(
92-
zone_parser_t *parser,
93-
const zone_type_info_t *type,
94-
const zone_field_info_t *field,
95-
const token_t *token,
96-
uint8_t octets[255 + ZONE_BLOCK_SIZE],
97-
size_t *length)
98-
{
99-
return scan_name(parser, type, field, quoted, token, octets, length);
78+
*lengthp = (size_t)(b - octets);
79+
return l[0] != 0;// ? 0 : ZONE_NAME;
10080
}
10181

10282
zone_nonnull_all
@@ -112,32 +92,34 @@ static zone_really_inline int32_t parse_name(
11292

11393
if (zone_likely(token->code == CONTIGUOUS)) {
11494
// a freestanding "@" denotes the current origin
115-
if (token->data[0] == '@' && !is_contiguous((uint8_t)token->data[1]))
95+
if (token->data[0] == '@' && token->length > 1)
11696
goto relative;
117-
r = scan_contiguous_name(parser, type, field, token, o, &n);
97+
r = scan_name(parser, token, o, &n);
11898
if (r == 0)
119-
goto absolute;
120-
if (r < 0)
121-
return r;
99+
return (void)(parser->rdata->length += n), ZONE_NAME;
100+
if (r > 0)
101+
goto relative;
122102
} else if (token->code == QUOTED) {
123-
r = scan_quoted_name(parser, type, field, token, o, &n);
103+
if (token->length == 0)
104+
goto invalid;
105+
r = scan_name(parser, token, o, &n);
124106
if (r == 0)
125-
goto absolute;
126-
if (r < 0)
127-
return r;
107+
return (void)(parser->rdata->length += n), ZONE_NAME;
108+
if (r > 0)
109+
goto relative;
128110
} else {
129111
return have_string(parser, type, field, token);
130112
}
131113

114+
invalid:
115+
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
116+
132117
relative:
133118
if (n > 255 - parser->file->origin.length)
134119
SYNTAX_ERROR(parser, "Invalid %s in %s", NAME(field), TNAME(type));
135120
memcpy(o+n, parser->file->origin.octets, parser->file->origin.length);
136121
parser->rdata->length += n + parser->file->origin.length;
137122
return ZONE_NAME;
138-
absolute:
139-
parser->rdata->length += n;
140-
return ZONE_NAME;
141123
}
142124

143125
#endif // NAME_H

0 commit comments

Comments
 (0)