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:
parent
aeaa031cce
commit
5f6b5852b1
|
@ -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;
|
||||
|
|
25
ircd/net.cc
25
ircd/net.cc
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue