0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-01 01:28:54 +02:00

ircd::rfc1035: Add CNAME RR; minor cleanup.

This commit is contained in:
Jason Volk 2018-01-28 16:45:19 -08:00
parent aeaa031cce
commit 5f6b5852b1
3 changed files with 45 additions and 6 deletions

View file

@ -81,6 +81,7 @@ struct ircd::rfc1035::answer
{
struct A;
struct AAAA;
struct CNAME;
struct SRV;
uint16_t qtype;
@ -152,6 +153,14 @@ struct ircd::rfc1035::answer::AAAA
AAAA(const const_buffer &rdata);
};
struct ircd::rfc1035::answer::CNAME
{
size_t namelen;
char name[256];
CNAME(const const_buffer &rdata);
};
struct ircd::rfc1035::answer::SRV
{
uint16_t priority;

View file

@ -2533,14 +2533,31 @@ try
for(size_t i(0); i < header.ancount; ++i)
consume(buf, size(an[i].parse(buf)));
size_t ippi(0);
net::ipport ipp[header.ancount];
for(size_t i(0); i < header.ancount; ++i)
{
if(an[i].qtype != 0x01) // 'A'
continue;
switch(an[i].qtype)
{
case 0x01:
{
const rfc1035::answer::A rr(an[i].rdata);
ipp[ippi++] = { rr.ip4, port(tag.hp) };
continue;
}
const auto &ptr(data(an[i].rdata));
ipp[i] = { bswap(*(const uint32_t *)ptr), port(tag.hp) };
case 0x21:
{
const rfc1035::answer::SRV rr(an[i].rdata);
continue;
}
case 0x05:
{
const rfc1035::answer::CNAME rr(an[i].rdata);
continue;
}
}
}
if(tag.cb_many)

View file

@ -78,7 +78,7 @@ ircd::rfc1035::question::question(const string_view &fqdn,
ircd::const_buffer
ircd::rfc1035::question::parse(const const_buffer &in)
{
if(size(in) < 2 + 2 + 2)
if(unlikely(size(in) < 2 + 2 + 2))
throw error
{
"Answer input buffer underflow"
@ -86,7 +86,7 @@ ircd::rfc1035::question::parse(const const_buffer &in)
namelen = parse_name(name, in);
const char *pos(data(in) + namelen);
if(pos + 2 + 2 > end(in))
if(unlikely(pos + 2 + 2 > end(in)))
throw error
{
"Question input buffer is incomplete (%zu bytes)", size(in)
@ -174,6 +174,7 @@ ircd::rfc1035::answer::parse(const const_buffer &in)
ircd::rfc1035::answer::A::A(const const_buffer &rdata)
{
assert(size(rdata) == 4);
if(unlikely(size(rdata) < 4))
throw error
{
@ -185,6 +186,7 @@ ircd::rfc1035::answer::A::A(const const_buffer &rdata)
ircd::rfc1035::answer::AAAA::AAAA(const const_buffer &rdata)
{
assert(size(rdata) == 16);
if(unlikely(size(rdata) < 16))
throw error
{
@ -194,6 +196,17 @@ ircd::rfc1035::answer::AAAA::AAAA(const const_buffer &rdata)
ip6 = bswap(*(const uint128_t *)data(rdata));
}
ircd::rfc1035::answer::CNAME::CNAME(const const_buffer &rdata)
{
if(unlikely(size(rdata) < 1))
throw error
{
"CNAME record data underflow"
};
namelen = parse_name(name, rdata);
}
ircd::rfc1035::answer::SRV::SRV(const const_buffer &rdata)
{
if(unlikely(size(rdata) < 2 + 2 + 2 + 1))