12
12
zone_nonnull_all
13
13
static zone_really_inline int32_t scan_name (
14
14
zone_parser_t * parser ,
15
- const zone_type_info_t * type ,
16
- const zone_field_info_t * field ,
17
- const uint8_t delimiters [256 ],
18
15
const token_t * token ,
19
16
uint8_t octets [255 + ZONE_BLOCK_SIZE ],
20
- size_t * length )
17
+ size_t * lengthp )
21
18
{
22
19
uint8_t * l = octets , * b = octets + 1 ;
23
20
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 ;
25
24
26
25
l [0 ] = 0 ;
27
26
28
27
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 ;
32
33
return 0 ;
33
34
}
34
35
@@ -46,20 +47,23 @@ static zone_really_inline int32_t scan_name(
46
47
d [1 ] = (uint8_t )s [2 ] - '0' ;
47
48
d [2 ] = (uint8_t )s [3 ] - '0' ;
48
49
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));
50
52
b [0 ] = d [0 ] * 100 + d [1 ] * 10 + d [0 ];
51
53
b += 1 ; s += 4 ;
52
54
}
53
55
} else if (c == '.' ) {
54
56
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));
56
58
l [0 ] = (uint8_t )((b - 1 ) - l );
57
59
l = b ;
58
60
l [0 ] = 0 ;
59
61
b += 1 ; s += 1 ;
60
- } else if (delimiters [c ] != token -> code ) {
62
+ } else if (s == se ) {
63
+ //if (delimiters[c] != token->code) {
61
64
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));
63
67
l [0 ] = (uint8_t )((b - 1 ) - l );
64
68
break ;
65
69
} else {
@@ -68,35 +72,11 @@ static zone_really_inline int32_t scan_name(
68
72
}
69
73
}
70
74
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));
89
77
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;
100
80
}
101
81
102
82
zone_nonnull_all
@@ -112,32 +92,34 @@ static zone_really_inline int32_t parse_name(
112
92
113
93
if (zone_likely (token -> code == CONTIGUOUS )) {
114
94
// 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 )
116
96
goto relative ;
117
- r = scan_contiguous_name (parser , type , field , token , o , & n );
97
+ r = scan_name (parser , token , o , & n );
118
98
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 ;
122
102
} 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 );
124
106
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 ;
128
110
} else {
129
111
return have_string (parser , type , field , token );
130
112
}
131
113
114
+ invalid :
115
+ SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), TNAME (type ));
116
+
132
117
relative :
133
118
if (n > 255 - parser -> file -> origin .length )
134
119
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), TNAME (type ));
135
120
memcpy (o + n , parser -> file -> origin .octets , parser -> file -> origin .length );
136
121
parser -> rdata -> length += n + parser -> file -> origin .length ;
137
122
return ZONE_NAME ;
138
- absolute :
139
- parser -> rdata -> length += n ;
140
- return ZONE_NAME ;
141
123
}
142
124
143
125
#endif // NAME_H
0 commit comments