Commit 4c780a46 authored by Trond Myklebust's avatar Trond Myklebust

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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 550f5747
...@@ -316,21 +316,22 @@ static int flock_to_posix_lock(struct file *filp, struct file_lock *fl, ...@@ -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-1996 leaves the case l->l_len < 0 undefined;
POSIX-2001 defines it. */ POSIX-2001 defines it. */
start += l->l_start; start += l->l_start;
if (start < 0)
return -EINVAL;
fl->fl_end = OFFSET_MAX;
if (l->l_len > 0) {
end = start + l->l_len - 1; end = start + l->l_len - 1;
if (l->l_len < 0) { fl->fl_end = end;
} else if (l->l_len < 0) {
end = start - 1; end = start - 1;
fl->fl_end = end;
start += l->l_len; start += l->l_len;
}
if (start < 0) if (start < 0)
return -EINVAL; return -EINVAL;
if (l->l_len > 0 && end < 0) }
return -EOVERFLOW;
fl->fl_start = start; /* we record the absolute position */ fl->fl_start = start; /* we record the absolute position */
fl->fl_end = end; if (fl->fl_end < fl->fl_start)
if (l->l_len == 0) return -EOVERFLOW;
fl->fl_end = OFFSET_MAX;
fl->fl_owner = current->files; fl->fl_owner = current->files;
fl->fl_pid = current->tgid; fl->fl_pid = current->tgid;
...@@ -362,14 +363,21 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl, ...@@ -362,14 +363,21 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,
return -EINVAL; return -EINVAL;
} }
if (((start += l->l_start) < 0) || (l->l_len < 0)) start += l->l_start;
if (start < 0)
return -EINVAL; return -EINVAL;
fl->fl_end = OFFSET_MAX;
if (l->l_len > 0) {
fl->fl_end = start + l->l_len - 1; fl->fl_end = start + l->l_len - 1;
if (l->l_len > 0 && fl->fl_end < 0) } else if (l->l_len < 0) {
return -EOVERFLOW; fl->fl_end = start - 1;
start += l->l_len;
if (start < 0)
return -EINVAL;
}
fl->fl_start = start; /* we record the absolute position */ fl->fl_start = start; /* we record the absolute position */
if (l->l_len == 0) if (fl->fl_end < fl->fl_start)
fl->fl_end = OFFSET_MAX; return -EOVERFLOW;
fl->fl_owner = current->files; fl->fl_owner = current->files;
fl->fl_pid = current->tgid; fl->fl_pid = current->tgid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment