sunrpc: increase UNX_MAXNODENAME from 32 to __NEW_UTS_LEN bytes
authorJeff Layton <jlayton@poochiereds.net>
Mon, 3 Aug 2015 11:44:53 +0000 (07:44 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 12 Aug 2015 18:31:04 +0000 (14:31 -0400)
The current limit of 32 bytes artificially limits the name string that
we end up stuffing into NFSv4.x client ID blobs. If you have multiple
hosts with long hostnames that only differ near the end, then this can
cause NFSv4 client ID collisions.

Linux nodenames are actually limited to __NEW_UTS_LEN bytes (64), so use
that as the limit instead. Also, use XDR_QUADLEN to specify the slack
length, just for clarity and in case someone in the future changes this
to something not evenly divisible by 4.

Reported-by: Michael Skralivetsky <michael.skralivetsky@primarydata.com>
Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
include/linux/sunrpc/auth.h
net/sunrpc/auth_unix.c

index a7cbb570cc5c98cb76fe0a8733a1c791bca7419b..1ecf13e148b8be110f0175950e21e1f77833bbe9 100644 (file)
 #include <linux/atomic.h>
 #include <linux/rcupdate.h>
 #include <linux/uidgid.h>
+#include <linux/utsname.h>
 
-/* size of the nodename buffer */
-#define UNX_MAXNODENAME        32
+/*
+ * Size of the nodename buffer. RFC1831 specifies a hard limit of 255 bytes,
+ * but Linux hostnames are actually limited to __NEW_UTS_LEN bytes.
+ */
+#define UNX_MAXNODENAME        __NEW_UTS_LEN
 
 struct rpcsec_gss_info;
 
index 4feda2d0a8333eb6a280521b0dc187cae84e6621..548240dd15fcf018f81134ba0717327c13eb580e 100644 (file)
@@ -23,7 +23,7 @@ struct unx_cred {
 };
 #define uc_uid                 uc_base.cr_uid
 
-#define UNX_WRITESLACK         (21 + (UNX_MAXNODENAME >> 2))
+#define UNX_WRITESLACK         (21 + XDR_QUADLEN(UNX_MAXNODENAME))
 
 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
 # define RPCDBG_FACILITY       RPCDBG_AUTH