mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
NLM: Shrink the maximum request size of NLM4 requests
NLM version 4 requests estimate the call and reply header sizes rather conservatively, using the very maximum size allowed in the protocol even though Linux always uses only a small fraction of the allowable space. Reduce the size of caller and lock arguments to conserve RPC buffer space while XDR encoding NLM4 arguments. Add compile-time checks to ensure the hostname string won't overflow NLM protocol maximums. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
ca52fec152
commit
511d2e8855
3 changed files with 21 additions and 11 deletions
|
@ -510,17 +510,20 @@ nlmclt_decode_res(struct rpc_rqst *req, __be32 *p, struct nlm_res *resp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if (NLMCLNT_OHSIZE > XDR_MAX_NETOBJ)
|
||||
# error "NLM host name cannot be larger than XDR_MAX_NETOBJ!"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Buffer requirements for NLM
|
||||
*/
|
||||
#define NLM_void_sz 0
|
||||
#define NLM_cookie_sz 1+XDR_QUADLEN(NLM_MAXCOOKIELEN)
|
||||
#define NLM_caller_sz 1+XDR_QUADLEN(sizeof(utsname()->nodename))
|
||||
#define NLM_netobj_sz 1+XDR_QUADLEN(XDR_MAX_NETOBJ)
|
||||
/* #define NLM_owner_sz 1+XDR_QUADLEN(NLM_MAXOWNER) */
|
||||
#define NLM_caller_sz 1+XDR_QUADLEN(NLMCLNT_OHSIZE)
|
||||
#define NLM_owner_sz 1+XDR_QUADLEN(NLMCLNT_OHSIZE)
|
||||
#define NLM_fhandle_sz 1+XDR_QUADLEN(NFS2_FHSIZE)
|
||||
#define NLM_lock_sz 3+NLM_caller_sz+NLM_netobj_sz+NLM_fhandle_sz
|
||||
#define NLM_holder_sz 4+NLM_netobj_sz
|
||||
#define NLM_lock_sz 3+NLM_caller_sz+NLM_owner_sz+NLM_fhandle_sz
|
||||
#define NLM_holder_sz 4+NLM_owner_sz
|
||||
|
||||
#define NLM_testargs_sz NLM_cookie_sz+1+NLM_lock_sz
|
||||
#define NLM_lockargs_sz NLM_cookie_sz+4+NLM_lock_sz
|
||||
|
|
|
@ -516,17 +516,24 @@ nlm4clt_decode_res(struct rpc_rqst *req, __be32 *p, struct nlm_res *resp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if (NLMCLNT_OHSIZE > XDR_MAX_NETOBJ)
|
||||
# error "NLM host name cannot be larger than XDR_MAX_NETOBJ!"
|
||||
#endif
|
||||
|
||||
#if (NLMCLNT_OHSIZE > NLM_MAXSTRLEN)
|
||||
# error "NLM host name cannot be larger than NLM's maximum string length!"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Buffer requirements for NLM
|
||||
*/
|
||||
#define NLM4_void_sz 0
|
||||
#define NLM4_cookie_sz 1+XDR_QUADLEN(NLM_MAXCOOKIELEN)
|
||||
#define NLM4_caller_sz 1+XDR_QUADLEN(NLM_MAXSTRLEN)
|
||||
#define NLM4_netobj_sz 1+XDR_QUADLEN(XDR_MAX_NETOBJ)
|
||||
/* #define NLM4_owner_sz 1+XDR_QUADLEN(NLM4_MAXOWNER) */
|
||||
#define NLM4_caller_sz 1+XDR_QUADLEN(NLMCLNT_OHSIZE)
|
||||
#define NLM4_owner_sz 1+XDR_QUADLEN(NLMCLNT_OHSIZE)
|
||||
#define NLM4_fhandle_sz 1+XDR_QUADLEN(NFS3_FHSIZE)
|
||||
#define NLM4_lock_sz 5+NLM4_caller_sz+NLM4_netobj_sz+NLM4_fhandle_sz
|
||||
#define NLM4_holder_sz 6+NLM4_netobj_sz
|
||||
#define NLM4_lock_sz 5+NLM4_caller_sz+NLM4_owner_sz+NLM4_fhandle_sz
|
||||
#define NLM4_holder_sz 6+NLM4_owner_sz
|
||||
|
||||
#define NLM4_testargs_sz NLM4_cookie_sz+1+NLM4_lock_sz
|
||||
#define NLM4_lockargs_sz NLM4_cookie_sz+4+NLM4_lock_sz
|
||||
|
|
|
@ -88,7 +88,7 @@ struct nlm_wait;
|
|||
/*
|
||||
* Memory chunk for NLM client RPC request.
|
||||
*/
|
||||
#define NLMCLNT_OHSIZE (sizeof(utsname()->nodename)+10)
|
||||
#define NLMCLNT_OHSIZE ((__NEW_UTS_LEN) + 10u)
|
||||
struct nlm_rqst {
|
||||
unsigned int a_flags; /* initial RPC task flags */
|
||||
struct nlm_host * a_host; /* host handle */
|
||||
|
|
Loading…
Reference in a new issue