]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
nss-resolve: return NOTFOUND instead of UNAVAIL on resolution errors 4164/head
authorMartin Pitt <martin.pitt@ubuntu.com>
Fri, 16 Sep 2016 06:27:39 +0000 (08:27 +0200)
committerMartin Pitt <martin.pitt@ubuntu.com>
Sat, 1 Oct 2016 14:59:06 +0000 (16:59 +0200)
It needs to be possible to tell apart "the nss-resolve module does not exist"
(which can happen when running foreign-architecture programs) from "the queried
DNS name failed DNSSEC validation" or other errors. So return NOTFOUND for these
cases too, and only keep UNAVAIL for the cases where we cannot handle the given
address family.

This makes it possible to configure a fallback to "dns" without breaking
DNSSEC, with "resolve [!UNAVAIL=return] dns". Add this to the manpage.

This does not change behaviour if resolved is not running, as that already
falls back to the "dns" glibc module.

Fixes #4157

man/nss-resolve.xml
src/nss-resolve/nss-resolve.c

index 33f1f28a8cd7b52f4c0725d754526ab8587c915d..d66e8ba5217dc36d23422a5731188c2c76750646 100644 (file)
@@ -85,7 +85,7 @@
 group:          compat mymachines systemd
 shadow:         compat
 
-hosts:          files mymachines <command>resolve</command>
+hosts:          files mymachines <command>resolve [!UNAVAIL=return]</command> dns
 networks:       files
 
 protocols:      db files
@@ -95,6 +95,8 @@ rpc:            db files
 
 netgroup:       nis</programlisting>
 
+    <para>This keeps the <command>dns</command> module as a fallback for cases where the <command>nss-resolve</command>
+    module is not installed.</para>
   </refsect1>
 
   <refsect1>
index 5db83e5d0e366f25e5149dc65224655680536220..eea91e3e88ebb62e0daf29a596d62064884cb57a 100644 (file)
@@ -279,9 +279,12 @@ fallback:
         }
 
 fail:
+        /* When we arrive here, resolved runs and has answered (fallback to
+         * "dns" is handled earlier). So we have a definitive "no" answer and
+         * should not fall back to subsequent NSS modules via "UNAVAIL". */
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return NSS_STATUS_NOTFOUND;
 }
 
 enum nss_status _nss_resolve_gethostbyname3_r(
@@ -476,7 +479,7 @@ fallback:
 fail:
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return NSS_STATUS_NOTFOUND;
 }
 
 enum nss_status _nss_resolve_gethostbyaddr2_r(
@@ -666,7 +669,7 @@ fallback:
 fail:
         *errnop = -r;
         *h_errnop = NO_RECOVERY;
-        return NSS_STATUS_UNAVAIL;
+        return NSS_STATUS_NOTFOUND;
 }
 
 NSS_GETHOSTBYNAME_FALLBACKS(resolve);