File tree 4 files changed +17
-9
lines changed
4 files changed +17
-9
lines changed Original file line number Diff line number Diff line change @@ -286,7 +286,7 @@ static really_inline int32_t parse_salt(
286
286
size_t length = token -> length / 2 ;
287
287
uint8_t * octets = rdata -> octets ++ ;
288
288
// FIXME: not quite right yet! we must not exceed 255 octets!
289
- if ((uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < length )
289
+ if ((uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < ( length + 1 ) )
290
290
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
291
291
if (!base16_decode (token -> data , token -> length , rdata -> octets , & length ))
292
292
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
Original file line number Diff line number Diff line change @@ -50,12 +50,18 @@ nonnull_all
50
50
static really_inline int32_t parse_base32 (
51
51
parser_t * parser ,
52
52
const type_info_t * type ,
53
- const rdata_info_t * item ,
53
+ const rdata_info_t * field ,
54
54
rdata_t * rdata ,
55
55
const token_t * token )
56
56
{
57
57
uint32_t state = 0 ;
58
58
59
+ size_t length = (token -> length * 5 ) / 8 ;
60
+ if (length > 255 || (uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < (length + 1 ))
61
+ SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
62
+
63
+ * rdata -> octets ++ = (uint8_t )length ;
64
+
59
65
const char * p = token -> data ;
60
66
for (;; p ++ ) {
61
67
const uint8_t ofs = b32rmap [(uint8_t )* p ];
@@ -104,7 +110,7 @@ static really_inline int32_t parse_base32(
104
110
}
105
111
106
112
if (p != token -> data + token -> length )
107
- SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (item ), NAME (type ));
113
+ SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
108
114
return 0 ;
109
115
}
110
116
Original file line number Diff line number Diff line change @@ -85,13 +85,14 @@ static really_inline int32_t parse_base32(
85
85
const token_t * token )
86
86
{
87
87
size_t length = (token -> length * 5 ) / 8 ;
88
- if ((uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < length )
88
+ if (length > 255 || (uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < ( length + 1 ) )
89
89
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
90
90
91
- size_t decoded = base32hex_avx (rdata -> octets , (const uint8_t * )token -> data );
91
+ size_t decoded = base32hex_avx (rdata -> octets + 1 , (const uint8_t * )token -> data );
92
92
if (decoded != token -> length )
93
93
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
94
- rdata -> octets += length ;
94
+ * rdata -> octets = (uint8_t )length ;
95
+ rdata -> octets += 1 + length ;
95
96
return 0 ;
96
97
}
97
98
Original file line number Diff line number Diff line change @@ -74,13 +74,14 @@ static really_inline int32_t parse_base32(
74
74
const token_t * token )
75
75
{
76
76
size_t length = (token -> length * 5 ) / 8 ;
77
- if ((uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < length )
77
+ if (length > 255 || (uintptr_t )rdata -> limit - (uintptr_t )rdata -> octets < ( length + 1 ) )
78
78
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
79
79
80
- size_t decoded = base32hex_sse (rdata -> octets , (const uint8_t * )token -> data );
80
+ size_t decoded = base32hex_sse (rdata -> octets + 1 , (const uint8_t * )token -> data );
81
81
if (decoded != token -> length )
82
82
SYNTAX_ERROR (parser , "Invalid %s in %s" , NAME (field ), NAME (type ));
83
- rdata -> octets += length ;
83
+ * rdata -> octets = (uint8_t )length ;
84
+ rdata -> octets += 1 + length ;
84
85
return 0 ;
85
86
}
86
87
You can’t perform that action at this time.
0 commit comments