commit 081ba3c1923b29b9af5ef5871cdd903c90b0eecb
parent 5fa89b1c48e0e97d97c22fadf458ca6e6571fb46
Author: Drew DeVault <sir@cmpwn.com>
Date: Wed, 23 Jun 2021 10:01:54 -0400
net::dns: handle server errors in query
Signed-off-by: Drew DeVault <sir@cmpwn.com>
Diffstat:
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/net/dns/error.ha b/net/dns/error.ha
@@ -41,3 +41,13 @@ export fn strerror(err: error) const str = {
err: net::error => net::strerror(err),
};
};
+
+fn check_rcode(rcode: rcode) (void | error) = switch (rcode) {
+ rcode::NO_ERROR => void,
+ rcode::FMT_ERROR => format,
+ rcode::SERVER_FAILURE => server_failure,
+ rcode::NAME_ERROR => name_error,
+ rcode::NOT_IMPLEMENTED => not_implemented,
+ rcode::REFUSED => refused,
+ * => rcode: unknown_error,
+};
diff --git a/net/dns/query.ha b/net/dns/query.ha
@@ -20,6 +20,7 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = {
// TODO: Query multiple servers
udp::sendto(socket, sendbuf[..z], addr[0], 53)?;
+ let header = header { ... };
let recvbuf: [512]u8 = [0...];
for (true) {
// TODO: Add timeout
@@ -29,7 +30,6 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = {
continue;
};
- let header = header { ... };
let dec = decoder_init(recvbuf[..z]);
decode_header(&dec, &header)?;
if (header.id != query.header.id || header.op.qr != qr::RESPONSE) {
@@ -39,5 +39,6 @@ export fn query(query: *message, addr: ip::addr...) (*message | error) = {
break;
};
+ check_rcode(header.op.rcode)?;
return decode(recvbuf[..z])?;
};