Эх сурвалжийг харах

NFSv4: Ensure that we check lock exclusive/shared type against open modes

Since we may be simulating flock() locks using NFS byte range locks,
we can't rely on the VFS having checked the file open mode for us.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@vger.kernel.org
Trond Myklebust 13 жил өмнө
parent
commit
55725513b5
1 өөрчлөгдсөн 14 нэмэгдсэн , 0 устгасан
  1. 14 0
      fs/nfs/nfs4proc.c

+ 14 - 0
fs/nfs/nfs4proc.c

@@ -4726,6 +4726,20 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
 
 
 	if (state == NULL)
 	if (state == NULL)
 		return -ENOLCK;
 		return -ENOLCK;
+	/*
+	 * Don't rely on the VFS having checked the file open mode,
+	 * since it won't do this for flock() locks.
+	 */
+	switch (request->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) {
+	case F_RDLCK:
+		if (!(filp->f_mode & FMODE_READ))
+			return -EBADF;
+		break;
+	case F_WRLCK:
+		if (!(filp->f_mode & FMODE_WRITE))
+			return -EBADF;
+	}
+
 	do {
 	do {
 		status = nfs4_proc_setlk(state, cmd, request);
 		status = nfs4_proc_setlk(state, cmd, request);
 		if ((status != -EAGAIN) || IS_SETLK(cmd))
 		if ((status != -EAGAIN) || IS_SETLK(cmd))