From: David Howells <dhowells@redhat.com> Date: 2012-02-08 12:29:32
As the kernel has or will have filesystems (and possibly other services) that
want to obtain authentication tokens and/or encryption data on demand (via
GSSAPI for example), it would seem useful to provide an additional error code
to indicate a problem with the lookup, rather than overloading some other error
code.
We already have EKEYREJECTED, EKEYREVOKED and EKEYEXPIRED to indicate problems
with a token that we already have, but what if the authentication server just
isn't available?
Define ENOAUTHSERVICE to indicate "Authentication service unavailable". This
can be used to indicate, for example, that an attempt was made by request_key()
to retrieve a key, but the authentication server (e.g. a KDC) it is supposed to
contact didn't answer or that it couldn't determine the location of a suitable
server.
One way this can be used is that the user of a network filesystem can get a TGT
from the KDC and stash it in their session keyring, then the filesystem can
attempt to automatically get a ticket for accessing the filesystem - but if the
server is uncontactable then the ticket can be negatively instantiated with
KEYCTL_REJECT, giving the error to be handed to future requests as
ENOAUTHSERVICE and a small timeout so that the key will expire from the cache
and allow a retry after a short while to prevent thrashing.
Signed-off-by: David Howells <redacted>
---
arch/alpha/include/asm/errno.h | 1 +
arch/mips/include/asm/errno.h | 1 +
arch/parisc/include/asm/errno.h | 1 +
arch/sparc/include/asm/errno.h | 1 +
include/asm-generic/errno.h | 1 +
5 files changed, 5 insertions(+), 0 deletions(-)
@@ -121,6 +121,7 @@#define ENOTRECOVERABLE 137 /* State not recoverable */#define ERFKILL 138 /* Operation not possible due to RF-kill */+#define ENOAUTHSERVICE 139 /* Authentication service not available */#define EHWPOISON 139 /* Memory page has hardware error */
@@ -120,6 +120,7 @@#define ENOTRECOVERABLE 166 /* State not recoverable */#define ERFKILL 167 /* Operation not possible due to RF-kill */+#define ENOAUTHSERVICE 168 /* Authentication service not available */#define EHWPOISON 168 /* Memory page has hardware error */
@@ -121,6 +121,7 @@#define ENOTRECOVERABLE 255 /* State not recoverable */#define ERFKILL 256 /* Operation not possible due to RF-kill */+#define ENOAUTHSERVICE 257 /* Authentication service not available */#define EHWPOISON 257 /* Memory page has hardware error */
@@ -111,6 +111,7 @@#define ENOTRECOVERABLE 133 /* State not recoverable */#define ERFKILL 134 /* Operation not possible due to RF-kill */+#define ENOAUTHSERVICE 135 /* Authentication service not available */#define EHWPOISON 135 /* Memory page has hardware error */
@@ -107,6 +107,7 @@#define ENOTRECOVERABLE 131 /* State not recoverable */#define ERFKILL 132 /* Operation not possible due to RF-kill */+#define ENOAUTHSERVICE 133 /* Authentication service not available */#define EHWPOISON 133 /* Memory page has hardware error */
From: David Howells <dhowells@redhat.com> Date: 2012-02-08 12:29:46
Now that the kernel has filesystems (and possibly other services) that want to
look up internet addresses corresponding to arbitrary hostnames retrieved from
the server, it would seem useful to provide a couple of error codes to indicate
problems with the look up, rather than overloading some other error code.
Define ENONAMESERVICE to indicate "Network name service unavailable". This can
be used to indicate, for example, that an attempt was made by dns_query() to
make a query, but the name server (e.g. a DNS server) it is supposed to contact
didn't answer or that it couldn't determine the location of a suitable server.
Define ENAMEUNKNOWN to indicate "Network name unknown". This can be used to
indicate, for example, that an attempt was made by dns_query() to make a query,
but the name server (e.g. a DNS server) replied indicating that it had no
matching records.
The DNS query upcall program can report these to keyctl_reject() so that cached
failed queries will respond with these errors until they expire.
Signed-off-by: David Howells <redacted>
---
arch/alpha/include/asm/errno.h | 2 ++
arch/mips/include/asm/errno.h | 2 ++
arch/parisc/include/asm/errno.h | 2 ++
arch/sparc/include/asm/errno.h | 2 ++
include/asm-generic/errno.h | 2 ++
5 files changed, 10 insertions(+), 0 deletions(-)
@@ -122,6 +122,8 @@#define ERFKILL 138 /* Operation not possible due to RF-kill */#define ENOAUTHSERVICE 139 /* Authentication service not available */+#define ENONAMESERVICE 140 /* Network name service unavailable */+#define ENAMEUNKNOWN 141 /* Network name unknown */#define EHWPOISON 139 /* Memory page has hardware error */
@@ -121,6 +121,8 @@#define ERFKILL 167 /* Operation not possible due to RF-kill */#define ENOAUTHSERVICE 168 /* Authentication service not available */+#define ENONAMESERVICE 169 /* Network name service unavailable */+#define ENAMEUNKNOWN 170 /* Network name unknown */#define EHWPOISON 168 /* Memory page has hardware error */
@@ -122,6 +122,8 @@#define ERFKILL 256 /* Operation not possible due to RF-kill */#define ENOAUTHSERVICE 257 /* Authentication service not available */+#define ENONAMESERVICE 258 /* Network name service unavailable */+#define ENAMEUNKNOWN 259 /* Network name unknown */#define EHWPOISON 257 /* Memory page has hardware error */
@@ -112,6 +112,8 @@#define ERFKILL 134 /* Operation not possible due to RF-kill */#define ENOAUTHSERVICE 135 /* Authentication service not available */+#define ENONAMESERVICE 136 /* Network name service unavailable */+#define ENAMEUNKNOWN 137 /* Network name unknown */#define EHWPOISON 135 /* Memory page has hardware error */
@@ -108,6 +108,8 @@#define ERFKILL 132 /* Operation not possible due to RF-kill */#define ENOAUTHSERVICE 133 /* Authentication service not available */+#define ENONAMESERVICE 134 /* Network name service unavailable */+#define ENAMEUNKNOWN 135 /* Network name unknown */#define EHWPOISON 133 /* Memory page has hardware error */
David Howells wrote:
Define ENAMEUNKNOWN to indicate "Network name unknown". This can be used to
indicate, for example, that an attempt was made by dns_query() to make a query,
but the name server (e.g. a DNS server) replied indicating that it had no
matching records.
Would this be the same as NXDOMAIN? That is, does it mean the name server
couldn't find a record, or does it mean that the record doesn't exist?
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Joseph S. Myers <hidden> Date: 2012-02-08 16:15:27
On Wed, 8 Feb 2012, David Howells wrote:
#define ERFKILL 132 /* Operation not possible due to RF-kill */
+#define ENOAUTHSERVICE 133 /* Authentication service not available */
#define EHWPOISON 133 /* Memory page has hardware error */
Defining the new error to have the same value as EHWPOISON seems rather
odd....
--
Joseph S. Myers
joseph@codesourcery.com
From: David Howells <dhowells@redhat.com> Date: 2012-02-09 10:05:15
Jim Rees [off-list ref] wrote:
Define ENAMEUNKNOWN to indicate "Network name unknown". This can be used to
indicate, for example, that an attempt was made by dns_query() to make a query,
but the name server (e.g. a DNS server) replied indicating that it had no
matching records.
Would this be the same as NXDOMAIN? That is, does it mean the name server
couldn't find a record, or does it mean that the record doesn't exist?
Is there a way to tell the difference? Can you store a negative record in the
DNS? Or is it that the DNS has records for the name, just not records of the
type you're looking for (eg. NO_ADDRESS/NO_DATA from gethostbyname())?
David
David Howells wrote:
Jim Rees [off-list ref] wrote:
> Define ENAMEUNKNOWN to indicate "Network name unknown". This can be used to
> indicate, for example, that an attempt was made by dns_query() to make a query,
> but the name server (e.g. a DNS server) replied indicating that it had no
> matching records.
>
> Would this be the same as NXDOMAIN? That is, does it mean the name server
> couldn't find a record, or does it mean that the record doesn't exist?
Is there a way to tell the difference? Can you store a negative record in the
DNS? Or is it that the DNS has records for the name, just not records of the
type you're looking for (eg. NO_ADDRESS/NO_DATA from gethostbyname())?
It's an important distinction to the resolver if you want to avoid dns
hijacking. See rfc2308. There doesn't seem to be a way to tell the
difference from the gethostbyname call, which was designed before this was a
problem. The on-the-wire dns query protocol does make the distinction.
I suspect kernel dns clients won't need to know the difference, but I think
it's useful if we decide on and document the meaning of the error codes.
Maybe the answer is that ENAMEUNKNOWN means the same as a HOST_NOT_FOUND
from gethostbyname().
From: David Howells <dhowells@redhat.com> Date: 2012-02-10 20:02:41
Jim Rees [off-list ref] wrote:
> Would this be the same as NXDOMAIN? That is, does it mean the name server
> couldn't find a record, or does it mean that the record doesn't exist?
Is there a way to tell the difference? Can you store a negative record in
the DNS? Or is it that the DNS has records for the name, just not records
of the type you're looking for (eg. NO_ADDRESS/NO_DATA from
gethostbyname())?
It's an important distinction to the resolver if you want to avoid dns
hijacking. See rfc2308. There doesn't seem to be a way to tell the
difference from the gethostbyname call, which was designed before this was a
problem. The on-the-wire dns query protocol does make the distinction.
I suspect kernel dns clients won't need to know the difference, but I think
it's useful if we decide on and document the meaning of the error codes.
Maybe the answer is that ENAMEUNKNOWN means the same as a HOST_NOT_FOUND
from gethostbyname().
Should I propose an extra error code? Perhaps giving:
ENONAMESERVICE "Network name service unavailable"
ENAMEUNKNOWN "Network name not known"
ENONAMERECORD "Network name query returned no records"
Note that ENONAMESERVICE covers all of: not having a name service configured,
not being able to contact the configured name server and the configured name
server not being able to chain to the authoritative name server. However, I
think this is probably okay.
David