From 954cba660d299994163828be083742c27992536a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Apr 2019 21:26:46 +0200 Subject: [PATCH 1/7] nss-resolve: drop unnecessary variable We assign the same value to "ret" always, let's just return the value literally. --- src/nss-resolve/nss-resolve.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 0aa56c0882..60b7315946 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -118,7 +118,6 @@ enum nss_status _nss_resolve_gethostbyname4_r( _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; struct gaih_addrtuple *r_tuple, *r_tuple_first = NULL; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; - enum nss_status ret = NSS_STATUS_UNAVAIL; const char *canonical = NULL; size_t l, ms, idx; char *r_name; @@ -273,7 +272,7 @@ fail: UNPROTECT_ERRNO; *errnop = -r; *h_errnop = NO_RECOVERY; - return ret; + return NSS_STATUS_UNAVAIL; not_found: *h_errnop = HOST_NOT_FOUND; @@ -293,7 +292,6 @@ enum nss_status _nss_resolve_gethostbyname3_r( _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; char *r_name, *r_aliases, *r_addr, *r_addr_list; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; - enum nss_status ret = NSS_STATUS_UNAVAIL; size_t l, idx, ms, alen; const char *canonical; int c, r, i = 0; @@ -463,7 +461,7 @@ fail: UNPROTECT_ERRNO; *errnop = -r; *h_errnop = NO_RECOVERY; - return ret; + return NSS_STATUS_UNAVAIL; not_found: *h_errnop = HOST_NOT_FOUND; @@ -482,7 +480,6 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; char *r_name, *r_aliases, *r_addr, *r_addr_list; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; - enum nss_status ret = NSS_STATUS_UNAVAIL; unsigned c = 0, i = 0; size_t ms = 0, idx; const char *n; @@ -648,7 +645,7 @@ fail: UNPROTECT_ERRNO; *errnop = -r; *h_errnop = NO_RECOVERY; - return ret; + return NSS_STATUS_UNAVAIL; not_found: *h_errnop = HOST_NOT_FOUND; From c7c468c92aa599d4720ddf5eac49f55302fa5cc5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Apr 2019 21:27:16 +0200 Subject: [PATCH 2/7] nss-resolve: return error properly --- src/nss-resolve/nss-resolve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 60b7315946..65efcab385 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -571,7 +571,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( r = sd_bus_message_rewind(reply, false); if (r < 0) - return r; + goto fail; if (c <= 0) goto not_found; From a62fc245d01433ed4559db1f6f661a984b2bce03 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Apr 2019 21:57:44 +0200 Subject: [PATCH 3/7] nss-resolve: resue a jump target We can reuse "fail" here, since it does the same thing. --- src/nss-resolve/nss-resolve.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 65efcab385..3cfc20851d 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -502,10 +502,8 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( } if (len != FAMILY_ADDRESS_SIZE(af)) { - UNPROTECT_ERRNO; - *errnop = EINVAL; - *h_errnop = NO_RECOVERY; - return NSS_STATUS_UNAVAIL; + r = -EINVAL; + goto fail; } if (avoid_deadlock()) { From e09e7ac3c4107a9bbbcd0e5f1c21825cfcb27b02 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Apr 2019 21:40:49 +0200 Subject: [PATCH 4/7] nss-myhostname: unify code that handles NOT_FOUND case Just some minor rework to make this more like nss-resolve. --- src/nss-myhostname/nss-myhostname.c | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/nss-myhostname/nss-myhostname.c b/src/nss-myhostname/nss-myhostname.c index 707caaa321..90de140a9d 100644 --- a/src/nss-myhostname/nss-myhostname.c +++ b/src/nss-myhostname/nss-myhostname.c @@ -64,10 +64,8 @@ enum nss_status _nss_myhostname_gethostbyname4_r( } else if (is_gateway_hostname(name)) { n_addresses = local_gateways(NULL, 0, AF_UNSPEC, &addresses); - if (n_addresses <= 0) { - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } + if (n_addresses <= 0) + goto not_found; canonical = "_gateway"; @@ -81,10 +79,8 @@ enum nss_status _nss_myhostname_gethostbyname4_r( } /* We respond to our local host name, our hostname suffixed with a single dot. */ - if (!streq(name, hn) && !streq_ptr(startswith(name, hn), ".")) { - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } + if (!streq(name, hn) && !streq_ptr(startswith(name, hn), ".")) + goto not_found; n_addresses = local_addresses(NULL, 0, AF_UNSPEC, &addresses); if (n_addresses < 0) @@ -164,6 +160,10 @@ enum nss_status _nss_myhostname_gethostbyname4_r( h_errno = 0; return NSS_STATUS_SUCCESS; + +not_found: + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; } static enum nss_status fill_in_hostent( @@ -339,10 +339,8 @@ enum nss_status _nss_myhostname_gethostbyname3_r( } else if (is_gateway_hostname(name)) { n_addresses = local_gateways(NULL, 0, af, &addresses); - if (n_addresses <= 0) { - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } + if (n_addresses <= 0) + goto not_found; canonical = "_gateway"; @@ -355,10 +353,8 @@ enum nss_status _nss_myhostname_gethostbyname3_r( return NSS_STATUS_TRYAGAIN; } - if (!streq(name, hn) && !streq_ptr(startswith(name, hn), ".")) { - *h_errnop = HOST_NOT_FOUND; - return NSS_STATUS_NOTFOUND; - } + if (!streq(name, hn) && !streq_ptr(startswith(name, hn), ".")) + goto not_found; n_addresses = local_addresses(NULL, 0, af, &addresses); if (n_addresses < 0) @@ -381,6 +377,10 @@ enum nss_status _nss_myhostname_gethostbyname3_r( errnop, h_errnop, ttlp, canonp); + +not_found: + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; } enum nss_status _nss_myhostname_gethostbyaddr2_r( From 2b0c1bfd8d4aff3097bf9c53c90908acc6faf56d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Apr 2019 21:56:37 +0200 Subject: [PATCH 5/7] nss-mymachines: return NO_RECOVERY instead of NO_DATA when we fail to do D-Bus and similar This makes more semantical sense and is what we do in nss-resolve in a similar case, hence let's remove the differences here. --- src/nss-mymachines/nss-mymachines.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nss-mymachines/nss-mymachines.c b/src/nss-mymachines/nss-mymachines.c index da3efb960a..0e76c43172 100644 --- a/src/nss-mymachines/nss-mymachines.c +++ b/src/nss-mymachines/nss-mymachines.c @@ -232,7 +232,7 @@ enum nss_status _nss_mymachines_gethostbyname4_r( fail: UNPROTECT_ERRNO; *errnop = -r; - *h_errnop = NO_DATA; + *h_errnop = NO_RECOVERY; return NSS_STATUS_UNAVAIL; } @@ -403,7 +403,7 @@ enum nss_status _nss_mymachines_gethostbyname3_r( fail: UNPROTECT_ERRNO; *errnop = -r; - *h_errnop = NO_DATA; + *h_errnop = NO_RECOVERY; return NSS_STATUS_UNAVAIL; } From 547fde475978b44c16d01deb5614958967883741 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 11 Apr 2019 11:00:22 +0200 Subject: [PATCH 6/7] nss-resolve: simplify condition Of course, if the error is NXDOMAIN then it's not one of the errors listed for fallback, hence don't bother... --- src/nss-resolve/nss-resolve.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 3cfc20851d..113b0b1ee3 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -161,8 +161,7 @@ enum nss_status _nss_resolve_gethostbyname4_r( r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply); if (r < 0) { - if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") || - !bus_error_shall_fallback(&error)) + if (!bus_error_shall_fallback(&error)) goto not_found; /* Return NSS_STATUS_UNAVAIL when communication with systemd-resolved fails, @@ -342,8 +341,7 @@ enum nss_status _nss_resolve_gethostbyname3_r( r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply); if (r < 0) { - if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") || - !bus_error_shall_fallback(&error)) + if (!bus_error_shall_fallback(&error)) goto not_found; goto fail; @@ -543,8 +541,7 @@ enum nss_status _nss_resolve_gethostbyaddr2_r( r = sd_bus_call(bus, req, SD_RESOLVED_QUERY_TIMEOUT_USEC, &error, &reply); if (r < 0) { - if (sd_bus_error_has_name(&error, _BUS_ERROR_DNS "NXDOMAIN") || - !bus_error_shall_fallback(&error)) + if (!bus_error_shall_fallback(&error)) goto not_found; goto fail; From 8baaf650ef68a7def4f867e6ca3ff606783ea42f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 11 Apr 2019 11:06:40 +0200 Subject: [PATCH 7/7] nss-resolve: list more errors as cause for fallback If dbus-daemon kicks us from the bus or hangs, we should fallback too. Fixes: #12203 --- src/nss-resolve/nss-resolve.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/nss-resolve/nss-resolve.c b/src/nss-resolve/nss-resolve.c index 113b0b1ee3..ac5fff523b 100644 --- a/src/nss-resolve/nss-resolve.c +++ b/src/nss-resolve/nss-resolve.c @@ -26,7 +26,9 @@ static bool bus_error_shall_fallback(sd_bus_error *e) { return sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN) || sd_bus_error_has_name(e, SD_BUS_ERROR_NAME_HAS_NO_OWNER) || sd_bus_error_has_name(e, SD_BUS_ERROR_NO_REPLY) || - sd_bus_error_has_name(e, SD_BUS_ERROR_ACCESS_DENIED); + sd_bus_error_has_name(e, SD_BUS_ERROR_ACCESS_DENIED) || + sd_bus_error_has_name(e, SD_BUS_ERROR_DISCONNECTED) || + sd_bus_error_has_name(e, SD_BUS_ERROR_TIMEOUT); } static int count_addresses(sd_bus_message *m, int af, const char **canonical) {