Fix Connectathon locking test failure
We currently fail Connectathon test 6.10 in the case of 32-bit locks due to incorrect error checking. Also add support for l->l_len < 0 to 64-bit locks. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
550f57470c
commit
4c780a4688
1 changed files with 26 additions and 18 deletions
44
fs/locks.c
44
fs/locks.c
|
@ -316,21 +316,22 @@ static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,
|
|||
/* POSIX-1996 leaves the case l->l_len < 0 undefined;
|
||||
POSIX-2001 defines it. */
|
||||
start += l->l_start;
|
||||
end = start + l->l_len - 1;
|
||||
if (l->l_len < 0) {
|
||||
end = start - 1;
|
||||
start += l->l_len;
|
||||
}
|
||||
|
||||
if (start < 0)
|
||||
return -EINVAL;
|
||||
if (l->l_len > 0 && end < 0)
|
||||
return -EOVERFLOW;
|
||||
|
||||
fl->fl_start = start; /* we record the absolute position */
|
||||
fl->fl_end = end;
|
||||
if (l->l_len == 0)
|
||||
fl->fl_end = OFFSET_MAX;
|
||||
if (l->l_len > 0) {
|
||||
end = start + l->l_len - 1;
|
||||
fl->fl_end = end;
|
||||
} else if (l->l_len < 0) {
|
||||
end = start - 1;
|
||||
fl->fl_end = end;
|
||||
start += l->l_len;
|
||||
if (start < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
fl->fl_start = start; /* we record the absolute position */
|
||||
if (fl->fl_end < fl->fl_start)
|
||||
return -EOVERFLOW;
|
||||
|
||||
fl->fl_owner = current->files;
|
||||
fl->fl_pid = current->tgid;
|
||||
|
@ -362,14 +363,21 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (((start += l->l_start) < 0) || (l->l_len < 0))
|
||||
start += l->l_start;
|
||||
if (start < 0)
|
||||
return -EINVAL;
|
||||
fl->fl_end = start + l->l_len - 1;
|
||||
if (l->l_len > 0 && fl->fl_end < 0)
|
||||
return -EOVERFLOW;
|
||||
fl->fl_start = start; /* we record the absolute position */
|
||||
if (l->l_len == 0)
|
||||
fl->fl_end = OFFSET_MAX;
|
||||
if (l->l_len > 0) {
|
||||
fl->fl_end = start + l->l_len - 1;
|
||||
} else if (l->l_len < 0) {
|
||||
fl->fl_end = start - 1;
|
||||
start += l->l_len;
|
||||
if (start < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
fl->fl_start = start; /* we record the absolute position */
|
||||
if (fl->fl_end < fl->fl_start)
|
||||
return -EOVERFLOW;
|
||||
|
||||
fl->fl_owner = current->files;
|
||||
fl->fl_pid = current->tgid;
|
||||
|
|
Loading…
Reference in a new issue