]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
NFS: SETCLIENTID XDR buffer sizes are incorrect
authorChuck Lever <chuck.lever@oracle.com>
Sun, 9 Nov 2014 01:15:18 +0000 (20:15 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 25 Nov 2014 21:22:16 +0000 (16:22 -0500)
Use the correct calculation of the maximum size of a clientaddr4
when encoding and decoding SETCLIENTID operations. clientaddr4 is
defined in section 2.2.10 of RFC3530bis-31.

The usage in encode_setclientid_maxsz is missing the 4-byte length
in both strings, but is otherwise correct. decode_setclientid_maxsz
simply asks for a page of receive buffer space, which is
unnecessarily large (more than 4KB).

Note that a SETCLIENTID reply is either clientid+verifier, or
clientaddr4, depending on the returned NFS status. It doesn't
hurt to allocate enough space for both.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4xdr.c

index 206c08a60c7fb9cf4a7f5674722fe9e917d4ec5c..f8afa6783fb85122fd10a1055de1da0a2f7cf317 100644 (file)
@@ -141,13 +141,15 @@ static int nfs4_stat_to_errno(int);
                                XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
                                XDR_QUADLEN(NFS4_SETCLIENTID_NAMELEN) + \
                                1 /* sc_prog */ + \
-                               XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
-                               XDR_QUADLEN(RPCBIND_MAXUADDRLEN) + \
+                               1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
+                               1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN) + \
                                1) /* sc_cb_ident */
 #define decode_setclientid_maxsz \
                                (op_decode_hdr_maxsz + \
-                               2 + \
-                               1024) /* large value for CLID_INUSE */
+                               2 /* clientid */ + \
+                               XDR_QUADLEN(NFS4_VERIFIER_SIZE) + \
+                               1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN) + \
+                               1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN))
 #define encode_setclientid_confirm_maxsz \
                                (op_encode_hdr_maxsz + \
                                3 + (NFS4_VERIFIER_SIZE >> 2))