NFS: Ensure NFSv4 SETCLIENTID send buffer is large enough
Chuck Lever [Mon, 10 Dec 2007 19:56:54 +0000 (14:56 -0500)]
Ensure that the RPC buffer size specified for NFSv4 SETCLIENTID procedures
matches what we are encoding into the buffer.  See the definition of
struct nfs4_setclientid {} and the encode_setclientid() function.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

fs/nfs/nfs4xdr.c
include/linux/nfs_xdr.h

index eae46f0..db1ed9c 100644 (file)
@@ -116,10 +116,12 @@ static int nfs4_stat_to_errno(int);
 #define decode_renew_maxsz     (op_decode_hdr_maxsz)
 #define encode_setclientid_maxsz \
                                (op_encode_hdr_maxsz + \
-                               4 /*server->ip_addr*/ + \
-                               1 /*Netid*/ + \
-                               6 /*uaddr*/ + \
-                               6 + (NFS4_VERIFIER_SIZE >> 2))
+                               XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
+                               XDR_QUADLEN(NFS4_SETCLIENTID_NAMELEN) + \
+                               1 /* sc_prog */ + \
+                               XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
+                               XDR_QUADLEN(RPCBIND_MAXUADDRLEN) + \
+                               1) /* sc_cb_ident */
 #define decode_setclientid_maxsz \
                                (op_decode_hdr_maxsz + \
                                2 + \
index 6b213a6..d8e395d 100644 (file)
@@ -666,16 +666,17 @@ struct nfs4_rename_res {
        struct nfs_fattr *              new_fattr;
 };
 
+#define NFS4_SETCLIENTID_NAMELEN       (48)
 struct nfs4_setclientid {
-       const nfs4_verifier *           sc_verifier;      /* request */
+       const nfs4_verifier *           sc_verifier;
        unsigned int                    sc_name_len;
-       char                            sc_name[48];      /* request */
-       u32                             sc_prog;          /* request */
+       char                            sc_name[NFS4_SETCLIENTID_NAMELEN];
+       u32                             sc_prog;
        unsigned int                    sc_netid_len;
-       char                            sc_netid[4];      /* request */
+       char                            sc_netid[RPCBIND_MAXNETIDLEN];
        unsigned int                    sc_uaddr_len;
-       char                            sc_uaddr[24];     /* request */
-       u32                             sc_cb_ident;      /* request */
+       char                            sc_uaddr[RPCBIND_MAXUADDRLEN];
+       u32                             sc_cb_ident;
 };
 
 struct nfs4_statfs_arg {