Skip to content

Commit

Permalink
Fix Connectathon locking test failure
Browse files Browse the repository at this point in the history
 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>
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Oct 18, 2005
1 parent 550f574 commit 4c780a4
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions fs/locks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
if (start < 0)
return -EINVAL;
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;
}

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 (fl->fl_end < fl->fl_start)
return -EOVERFLOW;

fl->fl_owner = current->files;
fl->fl_pid = current->tgid;
Expand Down Expand Up @@ -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_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 (l->l_len == 0)
fl->fl_end = OFFSET_MAX;
if (fl->fl_end < fl->fl_start)
return -EOVERFLOW;

fl->fl_owner = current->files;
fl->fl_pid = current->tgid;
Expand Down

0 comments on commit 4c780a4

Please sign in to comment.