linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] futex: Fix issues found with trinity and static analysis
@ 2012-07-20 18:46 Darren Hart
  2012-07-20 18:46 ` [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi Darren Hart
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Darren Hart @ 2012-07-20 18:46 UTC (permalink / raw)
  To: Linux Kernel Mailing List

Dave Jones and Dan Carpenter reported issues uncovered via trinity and static
analysis respectively.

The following changes since commit 85efc72a0218335324d358ac479a04c16316fd4d:

  Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client (2012-07-19 16:11:28 -0700)

are available in the git repository at:

  git://git.infradead.org/users/dvhart/linux-2.6.git futex

Darren Hart (3):
  futex: Test for pi_mutex on fault in futex_wait_requeue_pi
  futex: Fix bug in WARN_ON for NULL q.pi_state
  futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi()

 kernel/futex.c |   17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi
  2012-07-20 18:46 [PATCH 0/3] futex: Fix issues found with trinity and static analysis Darren Hart
@ 2012-07-20 18:46 ` Darren Hart
  2012-07-24 14:22   ` [tip:core/urgent] futex: Test for pi_mutex on fault in futex_wait_requeue_pi() tip-bot for Darren Hart
  2012-07-20 18:46 ` [PATCH 2/3] futex: Fix bug in WARN_ON for NULL q.pi_state Darren Hart
  2012-07-20 18:46 ` [PATCH 3/3] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi() Darren Hart
  2 siblings, 1 reply; 7+ messages in thread
From: Darren Hart @ 2012-07-20 18:46 UTC (permalink / raw)
  To: Linux Kernel Mailing List

If fixup_pi_state_owner() faults, pi_mutex may be NULL. Test
for pi_mutex != NULL before testing the owner against current
and possibly unlocking it.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
CC: Dave Jones <davej@redhat.com>
CC: Dan Carpenter <dan.carpenter@oracle.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/futex.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index e2b0fb9..05018bf 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2370,7 +2370,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 	 * fault, unlock the rt_mutex and return the fault to userspace.
 	 */
 	if (ret == -EFAULT) {
-		if (rt_mutex_owner(pi_mutex) == current)
+		if (pi_mutex && rt_mutex_owner(pi_mutex) == current)
 			rt_mutex_unlock(pi_mutex);
 	} else if (ret == -EINTR) {
 		/*
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] futex: Fix bug in WARN_ON for NULL q.pi_state
  2012-07-20 18:46 [PATCH 0/3] futex: Fix issues found with trinity and static analysis Darren Hart
  2012-07-20 18:46 ` [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi Darren Hart
@ 2012-07-20 18:46 ` Darren Hart
  2012-07-24 14:23   ` [tip:core/urgent] " tip-bot for Darren Hart
  2012-07-20 18:46 ` [PATCH 3/3] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi() Darren Hart
  2 siblings, 1 reply; 7+ messages in thread
From: Darren Hart @ 2012-07-20 18:46 UTC (permalink / raw)
  To: Linux Kernel Mailing List

The WARN_ON in futex_wait_requeue_pi() for a NULL q.pi_state was testing
the address (&q.pi_state) of the pointer instead of the value
(q.pi_state) of the pointer. Correct it accordingly.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
CC: Dave Jones <davej@redhat.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/futex.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index 05018bf..5551ada 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2343,7 +2343,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 		 * signal.  futex_unlock_pi() will not destroy the lock_ptr nor
 		 * the pi_state.
 		 */
-		WARN_ON(!&q.pi_state);
+		WARN_ON(!q.pi_state);
 		pi_mutex = &q.pi_state->pi_mutex;
 		ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter, 1);
 		debug_rt_mutex_free_waiter(&rt_waiter);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi()
  2012-07-20 18:46 [PATCH 0/3] futex: Fix issues found with trinity and static analysis Darren Hart
  2012-07-20 18:46 ` [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi Darren Hart
  2012-07-20 18:46 ` [PATCH 2/3] futex: Fix bug in WARN_ON for NULL q.pi_state Darren Hart
@ 2012-07-20 18:46 ` Darren Hart
  2012-07-24 14:24   ` [tip:core/urgent] " tip-bot for Darren Hart
  2 siblings, 1 reply; 7+ messages in thread
From: Darren Hart @ 2012-07-20 18:46 UTC (permalink / raw)
  To: Linux Kernel Mailing List

If uaddr == uaddr2, then we have broken the rule of only requeueing from
a non-pi futex to a pi futex with this call. If we attempt this, as the
trinity test suite manages to do, we miss early wakeups as q.key is
equal to key2 (because they are the same uaddr). We will then attempt to
dereference the pi_mutex (which would exist had the futex_q been
properly requeued to a pi futex) and trigger a NULL pointer dereference.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
CC: Dave Jones <davej@redhat.com>
CC: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/futex.c |   13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index 5551ada..3717e7b 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2231,11 +2231,11 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb,
  * @uaddr2:	the pi futex we will take prior to returning to user-space
  *
  * The caller will wait on uaddr and will be requeued by futex_requeue() to
- * uaddr2 which must be PI aware.  Normal wakeup will wake on uaddr2 and
- * complete the acquisition of the rt_mutex prior to returning to userspace.
- * This ensures the rt_mutex maintains an owner when it has waiters; without
- * one, the pi logic wouldn't know which task to boost/deboost, if there was a
- * need to.
+ * uaddr2 which must be PI aware and unique from uaddr.  Normal wakeup will wake
+ * on uaddr2 and complete the acquisition of the rt_mutex prior to returning to
+ * userspace.  This ensures the rt_mutex maintains an owner when it has waiters;
+ * without one, the pi logic would not know which task to boost/deboost, if
+ * there was a need to.
  *
  * We call schedule in futex_wait_queue_me() when we enqueue and return there
  * via the following:
@@ -2272,6 +2272,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 	struct futex_q q = futex_q_init;
 	int res, ret;
 
+	if (uaddr == uaddr2)
+		return -EINVAL;
+
 	if (!bitset)
 		return -EINVAL;
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [tip:core/urgent] futex: Test for pi_mutex on fault in futex_wait_requeue_pi()
  2012-07-20 18:46 ` [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi Darren Hart
@ 2012-07-24 14:22   ` tip-bot for Darren Hart
  0 siblings, 0 replies; 7+ messages in thread
From: tip-bot for Darren Hart @ 2012-07-24 14:22 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, hpa, mingo, dvhart, davej, tglx, dan.carpenter

Commit-ID:  b6070a8d9853eda010a549fa9a09eb8d7269b929
Gitweb:     http://git.kernel.org/tip/b6070a8d9853eda010a549fa9a09eb8d7269b929
Author:     Darren Hart <dvhart@linux.intel.com>
AuthorDate: Fri, 20 Jul 2012 11:53:29 -0700
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 24 Jul 2012 16:02:56 +0200

futex: Test for pi_mutex on fault in futex_wait_requeue_pi()

If fixup_pi_state_owner() faults, pi_mutex may be NULL. Test
for pi_mutex != NULL before testing the owner against current
and possibly unlocking it.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/dc59890338fc413606f04e5c5b131530734dae3d.1342809673.git.dvhart@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/futex.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index e2b0fb9..05018bf 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2370,7 +2370,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 	 * fault, unlock the rt_mutex and return the fault to userspace.
 	 */
 	if (ret == -EFAULT) {
-		if (rt_mutex_owner(pi_mutex) == current)
+		if (pi_mutex && rt_mutex_owner(pi_mutex) == current)
 			rt_mutex_unlock(pi_mutex);
 	} else if (ret == -EINTR) {
 		/*

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [tip:core/urgent] futex: Fix bug in WARN_ON for NULL q.pi_state
  2012-07-20 18:46 ` [PATCH 2/3] futex: Fix bug in WARN_ON for NULL q.pi_state Darren Hart
@ 2012-07-24 14:23   ` tip-bot for Darren Hart
  0 siblings, 0 replies; 7+ messages in thread
From: tip-bot for Darren Hart @ 2012-07-24 14:23 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, dvhart, davej, tglx

Commit-ID:  f27071cb7fe3e1d37a9dbe6c0dfc5395cd40fa43
Gitweb:     http://git.kernel.org/tip/f27071cb7fe3e1d37a9dbe6c0dfc5395cd40fa43
Author:     Darren Hart <dvhart@linux.intel.com>
AuthorDate: Fri, 20 Jul 2012 11:53:30 -0700
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 24 Jul 2012 16:02:57 +0200

futex: Fix bug in WARN_ON for NULL q.pi_state

The WARN_ON in futex_wait_requeue_pi() for a NULL q.pi_state was testing
the address (&q.pi_state) of the pointer instead of the value
(q.pi_state) of the pointer. Correct it accordingly.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Cc: Dave Jones <davej@redhat.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/1c85d97f6e5f79ec389a4ead3e367363c74bd09a.1342809673.git.dvhart@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/futex.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index 05018bf..5551ada 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2343,7 +2343,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 		 * signal.  futex_unlock_pi() will not destroy the lock_ptr nor
 		 * the pi_state.
 		 */
-		WARN_ON(!&q.pi_state);
+		WARN_ON(!q.pi_state);
 		pi_mutex = &q.pi_state->pi_mutex;
 		ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter, 1);
 		debug_rt_mutex_free_waiter(&rt_waiter);

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [tip:core/urgent] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi()
  2012-07-20 18:46 ` [PATCH 3/3] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi() Darren Hart
@ 2012-07-24 14:24   ` tip-bot for Darren Hart
  0 siblings, 0 replies; 7+ messages in thread
From: tip-bot for Darren Hart @ 2012-07-24 14:24 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, dvhart, davej, tglx

Commit-ID:  6f7b0a2a5c0fb03be7c25bd1745baa50582348ef
Gitweb:     http://git.kernel.org/tip/6f7b0a2a5c0fb03be7c25bd1745baa50582348ef
Author:     Darren Hart <dvhart@linux.intel.com>
AuthorDate: Fri, 20 Jul 2012 11:53:31 -0700
Committer:  Thomas Gleixner <tglx@linutronix.de>
CommitDate: Tue, 24 Jul 2012 16:02:57 +0200

futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi()

If uaddr == uaddr2, then we have broken the rule of only requeueing
from a non-pi futex to a pi futex with this call. If we attempt this,
as the trinity test suite manages to do, we miss early wakeups as
q.key is equal to key2 (because they are the same uaddr). We will then
attempt to dereference the pi_mutex (which would exist had the futex_q
been properly requeued to a pi futex) and trigger a NULL pointer
dereference.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Cc: Dave Jones <davej@redhat.com>
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/ad82bfe7f7d130247fbe2b5b4275654807774227.1342809673.git.dvhart@linux.intel.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

---
 kernel/futex.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index 5551ada..3717e7b 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -2231,11 +2231,11 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb,
  * @uaddr2:	the pi futex we will take prior to returning to user-space
  *
  * The caller will wait on uaddr and will be requeued by futex_requeue() to
- * uaddr2 which must be PI aware.  Normal wakeup will wake on uaddr2 and
- * complete the acquisition of the rt_mutex prior to returning to userspace.
- * This ensures the rt_mutex maintains an owner when it has waiters; without
- * one, the pi logic wouldn't know which task to boost/deboost, if there was a
- * need to.
+ * uaddr2 which must be PI aware and unique from uaddr.  Normal wakeup will wake
+ * on uaddr2 and complete the acquisition of the rt_mutex prior to returning to
+ * userspace.  This ensures the rt_mutex maintains an owner when it has waiters;
+ * without one, the pi logic would not know which task to boost/deboost, if
+ * there was a need to.
  *
  * We call schedule in futex_wait_queue_me() when we enqueue and return there
  * via the following:
@@ -2272,6 +2272,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
 	struct futex_q q = futex_q_init;
 	int res, ret;
 
+	if (uaddr == uaddr2)
+		return -EINVAL;
+
 	if (!bitset)
 		return -EINVAL;
 

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-07-24 14:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-20 18:46 [PATCH 0/3] futex: Fix issues found with trinity and static analysis Darren Hart
2012-07-20 18:46 ` [PATCH 1/3] futex: Test for pi_mutex on fault in futex_wait_requeue_pi Darren Hart
2012-07-24 14:22   ` [tip:core/urgent] futex: Test for pi_mutex on fault in futex_wait_requeue_pi() tip-bot for Darren Hart
2012-07-20 18:46 ` [PATCH 2/3] futex: Fix bug in WARN_ON for NULL q.pi_state Darren Hart
2012-07-24 14:23   ` [tip:core/urgent] " tip-bot for Darren Hart
2012-07-20 18:46 ` [PATCH 3/3] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi() Darren Hart
2012-07-24 14:24   ` [tip:core/urgent] " tip-bot for Darren Hart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).