0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-02 18:18:56 +02:00

ircd::rfc1035: Add size constexprs.

This commit is contained in:
Jason Volk 2019-03-13 13:09:21 -07:00
parent 74c7d1d5c1
commit dc377ea695
2 changed files with 22 additions and 7 deletions

View file

@ -23,7 +23,14 @@ namespace ircd::rfc1035
struct record;
enum class op :uint8_t;
constexpr size_t NAME_BUF_SIZE {256};
// Section 2.3.4 Size Limits
constexpr size_t LABEL_MAX {63};
constexpr size_t NAME_MAX {255};
constexpr size_t TTL_MAX {std::numeric_limits<int32_t>::max()};
constexpr size_t LABEL_BUF_SIZE {LABEL_MAX + 1};
constexpr size_t NAME_BUF_SIZE {NAME_MAX + 1};
extern const std::array<string_view, 25> rcode;
extern const std::unordered_map<string_view, uint16_t> qtype;
extern const std::map<uint16_t, string_view> rqtype;

View file

@ -356,10 +356,11 @@ ircd::rfc1035::make_name(const mutable_buffer &out,
*pos = '\0';
ircd::tokens(fqdn, '.', [&pos, &out](const string_view &label)
{
if(unlikely(size(label) >= 64))
if(unlikely(size(label) > LABEL_MAX))
throw error
{
"Single part of domain cannot exceed 63 characters"
"Single part of domain cannot exceed %zu characters",
LABEL_MAX
};
*pos++ = size(label);
@ -378,7 +379,14 @@ size_t
ircd::rfc1035::parse_name(const mutable_buffer &out,
const const_buffer &in)
{
assert(!empty(out));
if(unlikely(size(out) < NAME_BUF_SIZE))
throw error
{
"Name output buffer is %zu but RFC1035 requires %zu",
size(out),
NAME_BUF_SIZE
};
if(unlikely(empty(in)))
throw error
{
@ -408,9 +416,9 @@ ircd::rfc1035::parse_name(const mutable_buffer &out,
if(ret > size(out) - 1)
throw error
{
"Not enough space in name output buffer; have:%zu need:%zu",
size(out),
ret + 1
"Name of length %zu larger than %zu and would be truncated",
size_t(pos - data(in)),
NAME_MAX
};
assert(strnlen(data(out), size(out)) + 1 == ret);