Skip to content

Commit edbcc1f

Browse files
committed
resolve: generate a nice clean error when clients try to resolve a name when the network is down
1 parent 6955a3b commit edbcc1f

File tree

8 files changed

+38
-1
lines changed

8 files changed

+38
-1
lines changed

src/libsystemd/sd-bus/bus-common-errors.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = {
8080
SD_BUS_ERROR_MAP(BUS_ERROR_RR_TYPE_UNSUPPORTED, EOPNOTSUPP),
8181
SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_LINK, ENXIO),
8282
SD_BUS_ERROR_MAP(BUS_ERROR_LINK_BUSY, EBUSY),
83+
SD_BUS_ERROR_MAP(BUS_ERROR_NETWORK_DOWN, ENETDOWN),
8384

8485
SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_TRANSFER, ENXIO),
8586
SD_BUS_ERROR_MAP(BUS_ERROR_TRANSFER_IN_PROGRESS, EBUSY),

src/libsystemd/sd-bus/bus-common-errors.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
#define BUS_ERROR_RR_TYPE_UNSUPPORTED "org.freedesktop.resolve1.ResourceRecordTypeUnsupported"
8080
#define BUS_ERROR_NO_SUCH_LINK "org.freedesktop.resolve1.NoSuchLink"
8181
#define BUS_ERROR_LINK_BUSY "org.freedesktop.resolve1.LinkBusy"
82+
#define BUS_ERROR_NETWORK_DOWN "org.freedesktop.resolve1.NetworkDown"
8283
#define _BUS_ERROR_DNS "org.freedesktop.resolve1.DnsError."
8384

8485
#define BUS_ERROR_NO_SUCH_TRANSFER "org.freedesktop.import1.NoSuchTransfer"

src/resolve/resolved-bus.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ static int reply_query_state(DnsQuery *q) {
5959
case DNS_TRANSACTION_RR_TYPE_UNSUPPORTED:
6060
return sd_bus_reply_method_errorf(q->request, BUS_ERROR_RR_TYPE_UNSUPPORTED, "Server does not support requested resource record type");
6161

62+
case DNS_TRANSACTION_NETWORK_DOWN:
63+
return sd_bus_reply_method_errorf(q->request, BUS_ERROR_NETWORK_DOWN, "Network is down");
64+
6265
case DNS_TRANSACTION_RCODE_FAILURE: {
6366
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
6467

src/resolve/resolved-dns-query.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,8 @@ static int dns_query_synthesize_reply(DnsQuery *q, DnsTransactionState *state) {
891891
DNS_TRANSACTION_RCODE_FAILURE,
892892
DNS_TRANSACTION_NO_SERVERS,
893893
DNS_TRANSACTION_TIMEOUT,
894-
DNS_TRANSACTION_ATTEMPTS_MAX_REACHED))
894+
DNS_TRANSACTION_ATTEMPTS_MAX_REACHED,
895+
DNS_TRANSACTION_NETWORK_DOWN))
895896
return 0;
896897

897898
DNS_QUESTION_FOREACH(key, q->question_utf8) {

src/resolve/resolved-dns-scope.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,3 +1015,22 @@ bool dns_scope_name_needs_search_domain(DnsScope *s, const char *name) {
10151015

10161016
return dns_name_is_single_label(name);
10171017
}
1018+
1019+
bool dns_scope_network_good(DnsScope *s) {
1020+
Iterator i;
1021+
Link *l;
1022+
1023+
/* Checks whether the network is in good state for lookups on this scope. For mDNS/LLMNR/Classic DNS scopes
1024+
* bound to links this is easy, as they don't even exist if the link isn't in a suitable state. For the global
1025+
* DNS scope we check whether there are any links that are up and have an address. */
1026+
1027+
if (s->link)
1028+
return true;
1029+
1030+
HASHMAP_FOREACH(l, s->manager->links, i) {
1031+
if (link_relevant(l, AF_UNSPEC, false))
1032+
return true;
1033+
}
1034+
1035+
return false;
1036+
}

src/resolve/resolved-dns-scope.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,5 @@ void dns_scope_dump(DnsScope *s, FILE *f);
107107
DnsSearchDomain *dns_scope_get_search_domains(DnsScope *s);
108108

109109
bool dns_scope_name_needs_search_domain(DnsScope *s, const char *name);
110+
111+
bool dns_scope_network_good(DnsScope *s);

src/resolve/resolved-dns-transaction.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,6 +1094,14 @@ static int dns_transaction_prepare(DnsTransaction *t, usec_t ts) {
10941094

10951095
dns_transaction_stop_timeout(t);
10961096

1097+
r = dns_scope_network_good(t->scope);
1098+
if (r < 0)
1099+
return r;
1100+
if (r == 0) {
1101+
dns_transaction_complete(t, DNS_TRANSACTION_NETWORK_DOWN);
1102+
return 0;
1103+
}
1104+
10971105
if (t->n_attempts >= TRANSACTION_ATTEMPTS_MAX(t->scope->protocol)) {
10981106
dns_transaction_complete(t, DNS_TRANSACTION_ATTEMPTS_MAX_REACHED);
10991107
return 0;
@@ -2969,6 +2977,7 @@ static const char* const dns_transaction_state_table[_DNS_TRANSACTION_STATE_MAX]
29692977
[DNS_TRANSACTION_DNSSEC_FAILED] = "dnssec-failed",
29702978
[DNS_TRANSACTION_NO_TRUST_ANCHOR] = "no-trust-anchor",
29712979
[DNS_TRANSACTION_RR_TYPE_UNSUPPORTED] = "rr-type-unsupported",
2980+
[DNS_TRANSACTION_NETWORK_DOWN] = "network-down",
29722981
};
29732982
DEFINE_STRING_TABLE_LOOKUP(dns_transaction_state, DnsTransactionState);
29742983

src/resolve/resolved-dns-transaction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum DnsTransactionState {
4040
DNS_TRANSACTION_DNSSEC_FAILED,
4141
DNS_TRANSACTION_NO_TRUST_ANCHOR,
4242
DNS_TRANSACTION_RR_TYPE_UNSUPPORTED,
43+
DNS_TRANSACTION_NETWORK_DOWN,
4344
_DNS_TRANSACTION_STATE_MAX,
4445
_DNS_TRANSACTION_STATE_INVALID = -1
4546
};

0 commit comments

Comments
 (0)