From: Linus Torvalds <torvalds@linux-foundation.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Roland McGrath <roland@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
Andi Kleen <andi@firstfloor.org>,
"H. Peter Anvin" <hpa@zytor.com>,
Richard Henderson <rth@twiddle.net>,
wezhang@redhat.com, linux-kernel@vger.kernel.org,
Michael Kerrisk <mtk.manpages@gmail.com>,
William Cohen <wcohen@redhat.com>
Subject: Re: [PATCH 1/3] sys_personality: validate personality before set_personality()
Date: Thu, 27 May 2010 09:39:41 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.2.00.1005270921540.3689@i5.linux-foundation.org> (raw)
In-Reply-To: <20100527153548.GB13858@redhat.com>
On Thu, 27 May 2010, Oleg Nesterov wrote:
>
> --- 34-rc1/kernel/exec_domain.c~1_CK_OVERFLOW_EARLIER 2009-04-06 00:03:42.000000000 +0200
> +++ 34-rc1/kernel/exec_domain.c 2010-05-27 15:15:12.000000000 +0200
> @@ -193,9 +193,9 @@ SYSCALL_DEFINE1(personality, u_long, per
> u_long old = current->personality;
>
> if (personality != 0xffffffff) {
> - set_personality(personality);
> - if (current->personality != personality)
> + if ((unsigned int)personality != personality)
> return -EINVAL;
> + set_personality(personality);
> }
I think this is total random noise. The whole type system is crazy - don't
just paper over it.
The thing shouldn't use "u_long" in the first place. That's a totally
bogus type to start with (hint: do a "git grep u_long" and see that most
of them are in badly done drivers, and the _only_ hits inside kernel/ are
in that broken personality handling)
And if we decide that the field must fit in an unsigned int (reasonable),
then let's just ignore the top bits, and make it work right even if
somebody passes in an unsigned int!
IOW, we should just clean the mess up entirely. Like the appended, I
think.
NOTE! Untested, of course. But our whole system call infrastructure should
mean that on architectures like 64-bit powerpc that needs wrappers to make
sure that 32-bit arguments are properly sign-extended, this should all
work fine. We'll only look at the low bits.
(That "ident_map" should be "unsigned int" or even "unsigned char", but
that's a separate thing. I just got rid of the bogus "u_long" crap).
Linus
---
include/linux/personality.h | 2 +-
include/linux/syscalls.h | 2 +-
kernel/exec_domain.c | 18 +++++++++---------
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/include/linux/personality.h b/include/linux/personality.h
index 1261208..eec3bae 100644
--- a/include/linux/personality.h
+++ b/include/linux/personality.h
@@ -12,7 +12,7 @@ struct pt_regs;
extern int register_exec_domain(struct exec_domain *);
extern int unregister_exec_domain(struct exec_domain *);
-extern int __set_personality(unsigned long);
+extern int __set_personality(unsigned int);
#endif /* __KERNEL__ */
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 057929b..7a858d6 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -312,7 +312,7 @@ asmlinkage long sys_capget(cap_user_header_t header,
cap_user_data_t dataptr);
asmlinkage long sys_capset(cap_user_header_t header,
const cap_user_data_t data);
-asmlinkage long sys_personality(u_long personality);
+asmlinkage long sys_personality(unsigned int personality);
asmlinkage long sys_sigpending(old_sigset_t __user *set);
asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set,
diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c
index c35452c..e016d3c 100644
--- a/kernel/exec_domain.c
+++ b/kernel/exec_domain.c
@@ -27,7 +27,7 @@ static struct exec_domain *exec_domains = &default_exec_domain;
static DEFINE_RWLOCK(exec_domains_lock);
-static u_long ident_map[32] = {
+static unsigned long ident_map[32] = {
0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
@@ -56,10 +56,10 @@ default_handler(int segment, struct pt_regs *regp)
}
static struct exec_domain *
-lookup_exec_domain(u_long personality)
+lookup_exec_domain(unsigned int personality)
{
- struct exec_domain * ep;
- u_long pers = personality(personality);
+ struct exec_domain *ep;
+ unsigned int pers = personality(personality);
read_lock(&exec_domains_lock);
for (ep = exec_domains; ep; ep = ep->next) {
@@ -70,7 +70,7 @@ lookup_exec_domain(u_long personality)
#ifdef CONFIG_MODULES
read_unlock(&exec_domains_lock);
- request_module("personality-%ld", pers);
+ request_module("personality-%d", pers);
read_lock(&exec_domains_lock);
for (ep = exec_domains; ep; ep = ep->next) {
@@ -135,7 +135,7 @@ unregister:
}
int
-__set_personality(u_long personality)
+__set_personality(unsigned int personality)
{
struct exec_domain *ep, *oep;
@@ -188,9 +188,9 @@ static int __init proc_execdomains_init(void)
module_init(proc_execdomains_init);
#endif
-SYSCALL_DEFINE1(personality, u_long, personality)
+SYSCALL_DEFINE1(personality, unsigned int, personality)
{
- u_long old = current->personality;
+ unsigned int old = current->personality;
if (personality != 0xffffffff) {
set_personality(personality);
@@ -198,7 +198,7 @@ SYSCALL_DEFINE1(personality, u_long, personality)
return -EINVAL;
}
- return (long)old;
+ return old;
}
next prev parent reply other threads:[~2010-05-27 16:43 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-25 14:17 Q: sys_personality() && misc oddities Oleg Nesterov
2010-05-25 19:33 ` Roland McGrath
2010-05-26 12:36 ` Oleg Nesterov
2010-05-26 20:31 ` Roland McGrath
2010-05-26 20:35 ` H. Peter Anvin
2010-05-27 15:35 ` [PATCH 0/3] (Was: Q: sys_personality() && misc oddities) Oleg Nesterov
2010-05-27 15:35 ` [PATCH 1/3] sys_personality: validate personality before set_personality() Oleg Nesterov
2010-05-27 16:39 ` Linus Torvalds [this message]
2010-05-27 17:15 ` Oleg Nesterov
2010-05-27 17:51 ` Linus Torvalds
2010-05-27 18:13 ` Oleg Nesterov
2010-05-27 18:18 ` Andi Kleen
2010-05-28 19:11 ` [PATCH 0/2] sys_personality fixes v2 Oleg Nesterov
2010-05-28 19:12 ` [PATCH 1/2] change sys_personality() to accept "unsigned int" instead of u_long Oleg Nesterov
2010-05-28 19:12 ` [PATCH 2/2] remove the bogus checks in sys_personality()->__set_personality() path Oleg Nesterov
2010-05-28 19:28 ` [PATCH 0/2] sys_personality fixes v2 Linus Torvalds
2010-05-28 19:58 ` H. Peter Anvin
2010-05-28 19:59 ` Oleg Nesterov
2010-05-27 15:36 ` [PATCH 2/3] sys_personality: make sure (int)personality >= 0 Oleg Nesterov
2010-05-27 20:02 ` H. Peter Anvin
2010-05-28 19:03 ` Oleg Nesterov
2010-05-27 15:36 ` [PATCH 3/3] __set_personality: no need to check the old ->exec_domain Oleg Nesterov
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=alpine.LFD.2.00.1005270921540.3689@i5.linux-foundation.org \
--to=torvalds@linux-foundation.org \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mtk.manpages@gmail.com \
--cc=oleg@redhat.com \
--cc=roland@redhat.com \
--cc=rth@twiddle.net \
--cc=wcohen@redhat.com \
--cc=wezhang@redhat.com \
/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
all inboxes | Powered by JetHome®