From: arnd@arndb.de
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>,
David Miller <davem@davemloft.net>
Subject: [patch 2/3] futex_compat: simplify pointer magic
Date: Mon, 10 Sep 2007 21:13:26 +0200 [thread overview]
Message-ID: <20070910191648.715953031@arndb.de> (raw)
In-Reply-To: 20070910191324.847651727@arndb.de
[-- Attachment #1: futex_compat_type.diff --]
[-- Type: text/plain, Size: 3119 bytes --]
The futex_compat code currently mixes pointers to robust_list
and compat_robust_list for no apparent reason other than
requiring extra typecasts. It also uses an extra argument
to fetch_robust_entry() that is not useful but has caused
bugs to be introduced before.
Clean up the code to get rid of all this and make the compat
version look more like the native one.
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: David Miller <davem@davemloft.net>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Index: linux-2.6/kernel/futex_compat.c
===================================================================
--- linux-2.6.orig/kernel/futex_compat.c
+++ linux-2.6/kernel/futex_compat.c
@@ -16,15 +16,17 @@
/*
* Fetch a robust-list pointer. Bit 0 signals PI futexes:
*/
-static inline int
-fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry,
- compat_uptr_t __user *head, int *pi)
+static inline int fetch_robust_entry(struct compat_robust_list __user **entry,
+ compat_uptr_t __user *head,
+ unsigned int *pi)
{
- if (get_user(*uentry, head))
+ compat_uptr_t uentry;
+
+ if (get_user(uentry, head))
return -EFAULT;
- *entry = compat_ptr((*uentry) & ~1);
- *pi = (unsigned int)(*uentry) & 1;
+ *entry = compat_ptr((uentry) & ~1);
+ *pi = (unsigned int)(uentry) & 1;
return 0;
}
@@ -38,16 +40,16 @@ fetch_robust_entry(compat_uptr_t *uentry
void compat_exit_robust_list(struct task_struct *curr)
{
struct compat_robust_list_head __user *head = curr->compat_robust_list;
- struct robust_list __user *entry, *pending;
+ struct compat_robust_list __user *entry, *pending;
unsigned int limit = ROBUST_LIST_LIMIT, pi, pip;
- compat_uptr_t uentry, upending;
+
compat_long_t futex_offset;
/*
* Fetch the list head (which was registered earlier, via
* sys_set_robust_list()):
*/
- if (fetch_robust_entry(&uentry, &entry, &head->list.next, &pi))
+ if (fetch_robust_entry(&entry, &head->list.next, &pi))
return;
/*
* Fetch the relative futex offset:
@@ -58,13 +60,12 @@ void compat_exit_robust_list(struct task
* Fetch any possibly pending lock-add first, and handle it
* if it exists:
*/
- if (fetch_robust_entry(&upending, &pending,
- &head->list_op_pending, &pip))
+ if (fetch_robust_entry(&pending, &head->list_op_pending, &pip))
return;
if (pending)
handle_futex_death((void __user *)pending + futex_offset, curr, pip);
- while (entry != (struct robust_list __user *) &head->list) {
+ while (entry != &head->list) {
/*
* A pending lock might already be on the list, so
* dont process it twice:
@@ -73,12 +74,10 @@ void compat_exit_robust_list(struct task
if (handle_futex_death((void __user *)entry + futex_offset,
curr, pi))
return;
-
/*
* Fetch the next entry in the list:
*/
- if (fetch_robust_entry(&uentry, &entry,
- (compat_uptr_t __user *)&entry->next, &pi))
+ if (fetch_robust_entry(&entry, &entry->next, &pi))
return;
/*
* Avoid excessively long or circular lists:
--
next prev parent reply other threads:[~2007-09-10 19:23 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-10 19:13 [patch 0/3] futex_compat fixes arnd
2007-09-10 19:13 ` [patch 1/3] futex_compat: fix list traversal bugs arnd
2007-09-10 19:34 ` Ingo Molnar
2007-09-10 19:13 ` arnd [this message]
2007-09-10 19:35 ` [patch 2/3] futex_compat: simplify pointer magic Ingo Molnar
2007-09-10 19:13 ` [patch 3/3] futex_compat: update to match native version arnd
2007-09-10 19:35 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070910191648.715953031@arndb.de \
--to=arnd@arndb.de \
--cc=akpm@linux-foundation.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox