浏览代码

fix compat futex code for private futexes

When the private futex support was added the compat code wasn't changed.
The result is that code using compat code which fail, e.g., because the
timeout values are not correctly passed.  The following patch should fix
that.

Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Cc: Eric Dumazet <dada1@cosmosbay.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Ulrich Drepper 18 年之前
父节点
当前提交
f0ede66fca
共有 1 个文件被更改,包括 5 次插入4 次删除
  1. 5 4
      kernel/futex_compat.c

+ 5 - 4
kernel/futex_compat.c

@@ -144,20 +144,21 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
 	struct timespec ts;
 	struct timespec ts;
 	ktime_t t, *tp = NULL;
 	ktime_t t, *tp = NULL;
 	int val2 = 0;
 	int val2 = 0;
+	int cmd = op & FUTEX_CMD_MASK;
 
 
-	if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) {
+	if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) {
 		if (get_compat_timespec(&ts, utime))
 		if (get_compat_timespec(&ts, utime))
 			return -EFAULT;
 			return -EFAULT;
 		if (!timespec_valid(&ts))
 		if (!timespec_valid(&ts))
 			return -EINVAL;
 			return -EINVAL;
 
 
 		t = timespec_to_ktime(ts);
 		t = timespec_to_ktime(ts);
-		if (op == FUTEX_WAIT)
+		if (cmd == FUTEX_WAIT)
 			t = ktime_add(ktime_get(), t);
 			t = ktime_add(ktime_get(), t);
 		tp = &t;
 		tp = &t;
 	}
 	}
-	if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE
-	    || op == FUTEX_CMP_REQUEUE_PI)
+	if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE
+	    || cmd == FUTEX_CMP_REQUEUE_PI)
 		val2 = (int) (unsigned long) utime;
 		val2 = (int) (unsigned long) utime;
 
 
 	return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
 	return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);