Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nfsd4: check backchannel attributes on create_session

Make sure the client gives us an adequate backchannel.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>

+52 -24
+1 -24
fs/nfsd/nfs4callback.c
··· 37 37 #include "nfsd.h" 38 38 #include "state.h" 39 39 #include "netns.h" 40 + #include "xdr4cb.h" 40 41 41 42 #define NFSDDBG_FACILITY NFSDDBG_PROC 42 43 ··· 53 52 NFSPROC4_CLNT_CB_RECALL, 54 53 NFSPROC4_CLNT_CB_SEQUENCE, 55 54 }; 56 - 57 - #define NFS4_MAXTAGLEN 20 58 - 59 - #define NFS4_enc_cb_null_sz 0 60 - #define NFS4_dec_cb_null_sz 0 61 - #define cb_compound_enc_hdr_sz 4 62 - #define cb_compound_dec_hdr_sz (3 + (NFS4_MAXTAGLEN >> 2)) 63 - #define sessionid_sz (NFS4_MAX_SESSIONID_LEN >> 2) 64 - #define cb_sequence_enc_sz (sessionid_sz + 4 + \ 65 - 1 /* no referring calls list yet */) 66 - #define cb_sequence_dec_sz (op_dec_sz + sessionid_sz + 4) 67 - 68 - #define op_enc_sz 1 69 - #define op_dec_sz 2 70 - #define enc_nfs4_fh_sz (1 + (NFS4_FHSIZE >> 2)) 71 - #define enc_stateid_sz (NFS4_STATEID_SIZE >> 2) 72 - #define NFS4_enc_cb_recall_sz (cb_compound_enc_hdr_sz + \ 73 - cb_sequence_enc_sz + \ 74 - 1 + enc_stateid_sz + \ 75 - enc_nfs4_fh_sz) 76 - 77 - #define NFS4_dec_cb_recall_sz (cb_compound_dec_hdr_sz + \ 78 - cb_sequence_dec_sz + \ 79 - op_dec_sz) 80 55 81 56 struct nfs4_cb_compound_hdr { 82 57 /* args */
+25
fs/nfsd/nfs4state.c
··· 42 42 #include <linux/sunrpc/svcauth_gss.h> 43 43 #include <linux/sunrpc/addr.h> 44 44 #include "xdr4.h" 45 + #include "xdr4cb.h" 45 46 #include "vfs.h" 46 47 #include "current_stateid.h" 47 48 ··· 1795 1794 return nfs_ok; 1796 1795 } 1797 1796 1797 + static __be32 check_backchannel_attrs(struct nfsd4_channel_attrs *ca) 1798 + { 1799 + ca->headerpadsz = 0; 1800 + 1801 + /* 1802 + * These RPC_MAX_HEADER macros are overkill, especially since we 1803 + * don't even do gss on the backchannel yet. But this is still 1804 + * less than 1k. Tighten up this estimate in the unlikely event 1805 + * it turns out to be a problem for some client: 1806 + */ 1807 + if (ca->maxreq_sz < NFS4_enc_cb_recall_sz + RPC_MAX_HEADER_WITH_AUTH) 1808 + return nfserr_toosmall; 1809 + if (ca->maxresp_sz < NFS4_dec_cb_recall_sz + RPC_MAX_REPHEADER_WITH_AUTH) 1810 + return nfserr_toosmall; 1811 + ca->maxresp_cached = 0; 1812 + if (ca->maxops < 2) 1813 + return nfserr_toosmall; 1814 + 1815 + return nfs_ok; 1816 + } 1817 + 1798 1818 __be32 1799 1819 nfsd4_create_session(struct svc_rqst *rqstp, 1800 1820 struct nfsd4_compound_state *cstate, ··· 1832 1810 if (cr_ses->flags & ~SESSION4_FLAG_MASK_A) 1833 1811 return nfserr_inval; 1834 1812 status = check_forechannel_attrs(&cr_ses->fore_channel, nn); 1813 + if (status) 1814 + return status; 1815 + status = check_backchannel_attrs(&cr_ses->back_channel); 1835 1816 if (status) 1836 1817 return status; 1837 1818 status = nfserr_jukebox;
+23
fs/nfsd/xdr4cb.h
··· 1 + #define NFS4_MAXTAGLEN 20 2 + 3 + #define NFS4_enc_cb_null_sz 0 4 + #define NFS4_dec_cb_null_sz 0 5 + #define cb_compound_enc_hdr_sz 4 6 + #define cb_compound_dec_hdr_sz (3 + (NFS4_MAXTAGLEN >> 2)) 7 + #define sessionid_sz (NFS4_MAX_SESSIONID_LEN >> 2) 8 + #define cb_sequence_enc_sz (sessionid_sz + 4 + \ 9 + 1 /* no referring calls list yet */) 10 + #define cb_sequence_dec_sz (op_dec_sz + sessionid_sz + 4) 11 + 12 + #define op_enc_sz 1 13 + #define op_dec_sz 2 14 + #define enc_nfs4_fh_sz (1 + (NFS4_FHSIZE >> 2)) 15 + #define enc_stateid_sz (NFS4_STATEID_SIZE >> 2) 16 + #define NFS4_enc_cb_recall_sz (cb_compound_enc_hdr_sz + \ 17 + cb_sequence_enc_sz + \ 18 + 1 + enc_stateid_sz + \ 19 + enc_nfs4_fh_sz) 20 + 21 + #define NFS4_dec_cb_recall_sz (cb_compound_dec_hdr_sz + \ 22 + cb_sequence_dec_sz + \ 23 + op_dec_sz)
+3
include/linux/sunrpc/msg_prot.h
··· 138 138 #define RPC_MAX_HEADER_WITH_AUTH \ 139 139 (RPC_CALLHDRSIZE + 2*(2+RPC_MAX_AUTH_SIZE/4)) 140 140 141 + #define RPC_MAX_REPHEADER_WITH_AUTH \ 142 + (RPC_REPHDRSIZE + (2 + RPC_MAX_AUTH_SIZE/4)) 143 + 141 144 /* 142 145 * RFC1833/RFC3530 rpcbind (v3+) well-known netid's. 143 146 */