|
@@ -388,6 +388,18 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
|
|
|
fl->fl_ops = NULL;
|
|
|
fl->fl_lmops = NULL;
|
|
|
|
|
|
+ /* Ensure that fl->fl_filp has compatible f_mode */
|
|
|
+ switch (l->l_type) {
|
|
|
+ case F_RDLCK:
|
|
|
+ if (!(filp->f_mode & FMODE_READ))
|
|
|
+ return -EBADF;
|
|
|
+ break;
|
|
|
+ case F_WRLCK:
|
|
|
+ if (!(filp->f_mode & FMODE_WRITE))
|
|
|
+ return -EBADF;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
return assign_type(fl, l->l_type);
|
|
|
}
|
|
|
|
|
@@ -2025,23 +2037,6 @@ again:
|
|
|
file_lock->fl_flags |= FL_SLEEP;
|
|
|
}
|
|
|
|
|
|
- error = -EBADF;
|
|
|
- switch (flock.l_type) {
|
|
|
- case F_RDLCK:
|
|
|
- if (!(filp->f_mode & FMODE_READ))
|
|
|
- goto out;
|
|
|
- break;
|
|
|
- case F_WRLCK:
|
|
|
- if (!(filp->f_mode & FMODE_WRITE))
|
|
|
- goto out;
|
|
|
- break;
|
|
|
- case F_UNLCK:
|
|
|
- break;
|
|
|
- default:
|
|
|
- error = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
|
|
|
|
|
/*
|
|
@@ -2143,23 +2138,6 @@ again:
|
|
|
file_lock->fl_flags |= FL_SLEEP;
|
|
|
}
|
|
|
|
|
|
- error = -EBADF;
|
|
|
- switch (flock.l_type) {
|
|
|
- case F_RDLCK:
|
|
|
- if (!(filp->f_mode & FMODE_READ))
|
|
|
- goto out;
|
|
|
- break;
|
|
|
- case F_WRLCK:
|
|
|
- if (!(filp->f_mode & FMODE_WRITE))
|
|
|
- goto out;
|
|
|
- break;
|
|
|
- case F_UNLCK:
|
|
|
- break;
|
|
|
- default:
|
|
|
- error = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
|
|
|
|
|
/*
|