Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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;