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

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
Loading
Loading
Loading
Loading
+25 −17
Original line number Diff line number Diff line
@@ -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;
	if (start < 0)
		return -EINVAL;
	fl->fl_end = OFFSET_MAX;
	if (l->l_len > 0) {
		end = start + l->l_len - 1;
	if (l->l_len < 0) {
		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 (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;
@@ -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 = OFFSET_MAX;
	if (l->l_len > 0) {
		fl->fl_end = start + l->l_len - 1;
	if (l->l_len > 0 && fl->fl_end < 0)
		return -EOVERFLOW;
	} 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;