forked from mirrors/linux
		
	 7ff84910c6
			
		
	
	
		7ff84910c6
		
	
	
	
	
		
			
			Commit6930bcbfb6dropped the setting of the file_lock range when decoding a nlm_lock off the wire. This causes the client side grant callback to miss matching blocks and reject the lock, only to rerequest it 30s later. Add a helper function to set the file_lock range from the start and end values that the protocol uses, and have the nlm_lock decoder call that to set up the file_lock args properly. Fixes:6930bcbfb6("lockd: detect and reject lock arguments that overflow") Reported-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jeff Layton <jlayton@kernel.org> Tested-by: Amir Goldstein <amir73il@gmail.com> Cc: stable@vger.kernel.org #6.0 Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * linux/include/linux/lockd/xdr4.h
 | |
|  *
 | |
|  * XDR types for the NLM protocol
 | |
|  *
 | |
|  * Copyright (C) 1996 Olaf Kirch <okir@monad.swb.de>
 | |
|  */
 | |
| 
 | |
| #ifndef LOCKD_XDR4_H
 | |
| #define LOCKD_XDR4_H
 | |
| 
 | |
| #include <linux/fs.h>
 | |
| #include <linux/nfs.h>
 | |
| #include <linux/sunrpc/xdr.h>
 | |
| #include <linux/lockd/xdr.h>
 | |
| 
 | |
| /* error codes new to NLMv4 */
 | |
| #define	nlm4_deadlock		cpu_to_be32(NLM_DEADLCK)
 | |
| #define	nlm4_rofs		cpu_to_be32(NLM_ROFS)
 | |
| #define	nlm4_stale_fh		cpu_to_be32(NLM_STALE_FH)
 | |
| #define	nlm4_fbig		cpu_to_be32(NLM_FBIG)
 | |
| #define	nlm4_failed		cpu_to_be32(NLM_FAILED)
 | |
| 
 | |
| void	nlm4svc_set_file_lock_range(struct file_lock *fl, u64 off, u64 len);
 | |
| bool	nlm4svc_decode_void(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_testargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_lockargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_cancargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_unlockargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_res(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_reboot(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_shareargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_decode_notify(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| 
 | |
| bool	nlm4svc_encode_testres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_encode_res(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_encode_void(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| bool	nlm4svc_encode_shareres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
 | |
| 
 | |
| extern const struct rpc_version nlm_version4;
 | |
| 
 | |
| #endif /* LOCKD_XDR4_H */
 |