<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-stable.git/kernel, branch linux-2.6.22.y</title>
<subtitle>Linux kernel stable tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/'/>
<entry>
<title>vm audit: add VM_DONTEXPAND to mmap for drivers that need it (CVE-2008-0007)</title>
<updated>2008-02-06T19:43:46+00:00</updated>
<author>
<name>Nick Piggin</name>
<email>npiggin@suse.de</email>
</author>
<published>2008-02-02T02:08:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=83af8eda68a3f0c227d0eb05348e58ae27a62e7e'/>
<id>83af8eda68a3f0c227d0eb05348e58ae27a62e7e</id>
<content type='text'>
Drivers that register a -&gt;fault handler, but do not range-check the
offset argument, must set VM_DONTEXPAND in the vm_flags in order to
prevent an expanding mremap from overflowing the resource.

I've audited the tree and attempted to fix these problems (usually by
adding VM_DONTEXPAND where it is not obvious).

Signed-off-by: Nick Piggin &lt;npiggin@suse.de&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Drivers that register a -&gt;fault handler, but do not range-check the
offset argument, must set VM_DONTEXPAND in the vm_flags in order to
prevent an expanding mremap from overflowing the resource.

I've audited the tree and attempted to fix these problems (usually by
adding VM_DONTEXPAND where it is not obvious).

Signed-off-by: Nick Piggin &lt;npiggin@suse.de&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Revert "Fix SMP poweroff hangs"</title>
<updated>2007-12-14T18:32:00+00:00</updated>
<author>
<name>Greg Kroah-Hartman</name>
<email>gregkh@suse.de</email>
</author>
<published>2007-12-13T05:20:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=fc79ad5a2c4360a2ecc028a44cdffaa1634d7a14'/>
<id>fc79ad5a2c4360a2ecc028a44cdffaa1634d7a14</id>
<content type='text'>
This reverts the following changeset in 2.6.22.10 that caused a lot of
reported problems.

	From: Mark Lord &lt;lkml@rtr.ca&gt;

	commit 4047727e5ae33f9b8d2b7766d1994ea6e5ec2991 from upstream

	We need to disable all CPUs other than the boot CPU (usually 0) before
	attempting to power-off modern SMP machines.  This fixes the
	hang-on-poweroff issue on my MythTV SMP box, and also on Thomas Gleixner's
	new toybox.

	Signed-off-by: Mark Lord &lt;mlord@pobox.com&gt;
	Acked-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
	Cc: "Rafael J. Wysocki" &lt;rjw@sisk.pl&gt;
	Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
	Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
	Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

There still is a remaining shutdown problem in 2.6.22 with old APM based
systems, but this fix is not the correct one

Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;


</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This reverts the following changeset in 2.6.22.10 that caused a lot of
reported problems.

	From: Mark Lord &lt;lkml@rtr.ca&gt;

	commit 4047727e5ae33f9b8d2b7766d1994ea6e5ec2991 from upstream

	We need to disable all CPUs other than the boot CPU (usually 0) before
	attempting to power-off modern SMP machines.  This fixes the
	hang-on-poweroff issue on my MythTV SMP box, and also on Thomas Gleixner's
	new toybox.

	Signed-off-by: Mark Lord &lt;mlord@pobox.com&gt;
	Acked-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
	Cc: "Rafael J. Wysocki" &lt;rjw@sisk.pl&gt;
	Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
	Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
	Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

There still is a remaining shutdown problem in 2.6.22 with old APM based
systems, but this fix is not the correct one

Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;


</pre>
</div>
</content>
</entry>
<entry>
<title>futex: fix for futex_wait signal stack corruption</title>
<updated>2007-12-14T18:31:56+00:00</updated>
<author>
<name>Steven Rostedt</name>
<email>srostedt@redhat.com</email>
</author>
<published>2007-12-05T14:46:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=41cf31404f49923a2b87e3874de8f6d29548cc6a'/>
<id>41cf31404f49923a2b87e3874de8f6d29548cc6a</id>
<content type='text'>
From Steven Rostedt &lt;srostedt@redhat.com&gt;

patch ce6bd420f43b28038a2c6e8fbb86ad24014727b6 in mainline.

David Holmes found a bug in the -rt tree with respect to
pthread_cond_timedwait. After trying his test program on the latest git
from mainline, I found the bug was there too.  The bug he was seeing
that his test program showed, was that if one were to do a "Ctrl-Z" on a
process that was in the pthread_cond_timedwait, and then did a "bg" on
that process, it would return with a "-ETIMEDOUT" but early. That is,
the timer would go off early.

Looking into this, I found the source of the problem. And it is a rather
nasty bug at that.

Here's the relevant code from kernel/futex.c: (not in order in the file)

[...]
smlinkage long sys_futex(u32 __user *uaddr, int op, u32 val,
                          struct timespec __user *utime, u32 __user *uaddr2,
                          u32 val3)
{
        struct timespec ts;
        ktime_t t, *tp = NULL;
        u32 val2 = 0;
        int cmd = op &amp; FUTEX_CMD_MASK;

        if (utime &amp;&amp; (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) {
                if (copy_from_user(&amp;ts, utime, sizeof(ts)) != 0)
                        return -EFAULT;
                if (!timespec_valid(&amp;ts))
                        return -EINVAL;

                t = timespec_to_ktime(ts);
                if (cmd == FUTEX_WAIT)
                        t = ktime_add(ktime_get(), t);
                tp = &amp;t;
        }
[...]
        return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
}

[...]

long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
                u32 __user *uaddr2, u32 val2, u32 val3)
{
        int ret;
        int cmd = op &amp; FUTEX_CMD_MASK;
        struct rw_semaphore *fshared = NULL;

        if (!(op &amp; FUTEX_PRIVATE_FLAG))
                fshared = &amp;current-&gt;mm-&gt;mmap_sem;

        switch (cmd) {
        case FUTEX_WAIT:
                ret = futex_wait(uaddr, fshared, val, timeout);

[...]

static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
                      u32 val, ktime_t *abs_time)
{
[...]
               struct restart_block *restart;
                restart = &amp;current_thread_info()-&gt;restart_block;
                restart-&gt;fn = futex_wait_restart;
                restart-&gt;arg0 = (unsigned long)uaddr;
                restart-&gt;arg1 = (unsigned long)val;
                restart-&gt;arg2 = (unsigned long)abs_time;
                restart-&gt;arg3 = 0;
                if (fshared)
                        restart-&gt;arg3 |= ARG3_SHARED;
                return -ERESTART_RESTARTBLOCK;
[...]

static long futex_wait_restart(struct restart_block *restart)
{
        u32 __user *uaddr = (u32 __user *)restart-&gt;arg0;
        u32 val = (u32)restart-&gt;arg1;
        ktime_t *abs_time = (ktime_t *)restart-&gt;arg2;
        struct rw_semaphore *fshared = NULL;

        restart-&gt;fn = do_no_restart_syscall;
        if (restart-&gt;arg3 &amp; ARG3_SHARED)
                fshared = &amp;current-&gt;mm-&gt;mmap_sem;
        return (long)futex_wait(uaddr, fshared, val, abs_time);
}

So when the futex_wait is interrupt by a signal we break out of the
hrtimer code and set up or return from signal. This code does not return
back to userspace, so we set up a RESTARTBLOCK.  The bug here is that we
save the "abs_time" which is a pointer to the stack variable "ktime_t t"
from sys_futex.

This returns and unwinds the stack before we get to call our signal. On
return from the signal we go to futex_wait_restart, where we update all
the parameters for futex_wait and call it. But here we have a problem
where abs_time is no longer valid.

I verified this with print statements, and sure enough, what abs_time
was set to ends up being garbage when we get to futex_wait_restart.

The solution I did to solve this (with input from Linus Torvalds)
was to add unions to the restart_block to allow system calls to
use the restart with specific parameters.  This way the futex code now
saves the time in a 64bit value in the restart block instead of storing
it on the stack.

Note: I'm a bit nervious to add "linux/types.h" and use u32 and u64
in thread_info.h, when there's a #ifdef __KERNEL__ just below that.
Not sure what that is there for.  If this turns out to be a problem, I've
tested this with using "unsigned int" for u32 and "unsigned long long" for
u64 and it worked just the same. I'm using u32 and u64 just to be
consistent with what the futex code uses.

Signed-off-by: Steven Rostedt &lt;srostedt@redhat.com&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Acked-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
From Steven Rostedt &lt;srostedt@redhat.com&gt;

patch ce6bd420f43b28038a2c6e8fbb86ad24014727b6 in mainline.

David Holmes found a bug in the -rt tree with respect to
pthread_cond_timedwait. After trying his test program on the latest git
from mainline, I found the bug was there too.  The bug he was seeing
that his test program showed, was that if one were to do a "Ctrl-Z" on a
process that was in the pthread_cond_timedwait, and then did a "bg" on
that process, it would return with a "-ETIMEDOUT" but early. That is,
the timer would go off early.

Looking into this, I found the source of the problem. And it is a rather
nasty bug at that.

Here's the relevant code from kernel/futex.c: (not in order in the file)

[...]
smlinkage long sys_futex(u32 __user *uaddr, int op, u32 val,
                          struct timespec __user *utime, u32 __user *uaddr2,
                          u32 val3)
{
        struct timespec ts;
        ktime_t t, *tp = NULL;
        u32 val2 = 0;
        int cmd = op &amp; FUTEX_CMD_MASK;

        if (utime &amp;&amp; (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) {
                if (copy_from_user(&amp;ts, utime, sizeof(ts)) != 0)
                        return -EFAULT;
                if (!timespec_valid(&amp;ts))
                        return -EINVAL;

                t = timespec_to_ktime(ts);
                if (cmd == FUTEX_WAIT)
                        t = ktime_add(ktime_get(), t);
                tp = &amp;t;
        }
[...]
        return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
}

[...]

long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
                u32 __user *uaddr2, u32 val2, u32 val3)
{
        int ret;
        int cmd = op &amp; FUTEX_CMD_MASK;
        struct rw_semaphore *fshared = NULL;

        if (!(op &amp; FUTEX_PRIVATE_FLAG))
                fshared = &amp;current-&gt;mm-&gt;mmap_sem;

        switch (cmd) {
        case FUTEX_WAIT:
                ret = futex_wait(uaddr, fshared, val, timeout);

[...]

static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
                      u32 val, ktime_t *abs_time)
{
[...]
               struct restart_block *restart;
                restart = &amp;current_thread_info()-&gt;restart_block;
                restart-&gt;fn = futex_wait_restart;
                restart-&gt;arg0 = (unsigned long)uaddr;
                restart-&gt;arg1 = (unsigned long)val;
                restart-&gt;arg2 = (unsigned long)abs_time;
                restart-&gt;arg3 = 0;
                if (fshared)
                        restart-&gt;arg3 |= ARG3_SHARED;
                return -ERESTART_RESTARTBLOCK;
[...]

static long futex_wait_restart(struct restart_block *restart)
{
        u32 __user *uaddr = (u32 __user *)restart-&gt;arg0;
        u32 val = (u32)restart-&gt;arg1;
        ktime_t *abs_time = (ktime_t *)restart-&gt;arg2;
        struct rw_semaphore *fshared = NULL;

        restart-&gt;fn = do_no_restart_syscall;
        if (restart-&gt;arg3 &amp; ARG3_SHARED)
                fshared = &amp;current-&gt;mm-&gt;mmap_sem;
        return (long)futex_wait(uaddr, fshared, val, abs_time);
}

So when the futex_wait is interrupt by a signal we break out of the
hrtimer code and set up or return from signal. This code does not return
back to userspace, so we set up a RESTARTBLOCK.  The bug here is that we
save the "abs_time" which is a pointer to the stack variable "ktime_t t"
from sys_futex.

This returns and unwinds the stack before we get to call our signal. On
return from the signal we go to futex_wait_restart, where we update all
the parameters for futex_wait and call it. But here we have a problem
where abs_time is no longer valid.

I verified this with print statements, and sure enough, what abs_time
was set to ends up being garbage when we get to futex_wait_restart.

The solution I did to solve this (with input from Linus Torvalds)
was to add unions to the restart_block to allow system calls to
use the restart with specific parameters.  This way the futex code now
saves the time in a 64bit value in the restart block instead of storing
it on the stack.

Note: I'm a bit nervious to add "linux/types.h" and use u32 and u64
in thread_info.h, when there's a #ifdef __KERNEL__ just below that.
Not sure what that is there for.  If this turns out to be a problem, I've
tested this with using "unsigned int" for u32 and "unsigned long long" for
u64 and it worked just the same. I'm using u32 and u64 just to be
consistent with what the futex code uses.

Signed-off-by: Steven Rostedt &lt;srostedt@redhat.com&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Acked-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>hrtimers: avoid overflow for large relative timeouts (CVE-2007-5966)</title>
<updated>2007-12-14T18:31:56+00:00</updated>
<author>
<name>Thomas Gleixner</name>
<email>tglx@linutronix.de</email>
</author>
<published>2007-12-07T18:16:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=3e96745119d46a80b044b72634169621fc814dde'/>
<id>3e96745119d46a80b044b72634169621fc814dde</id>
<content type='text'>
patch 62f0f61e6673e67151a7c8c0f9a09c7ea43fe2b5 in mainline

Relative hrtimers with a large timeout value might end up as negative
timer values, when the current time is added in hrtimer_start().

This in turn is causing the clockevents_set_next() function to set an
huge timeout and sleep for quite a long time when we have a clock
source which is capable of long sleeps like HPET. With PIT this almost
goes unnoticed as the maximum delta is ~27ms. The non-hrt/nohz code
sorts this out in the next timer interrupt, so we never noticed that
problem which has been there since the first day of hrtimers.

This bug became more apparent in 2.6.24 which activates HPET on more
hardware.

Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch 62f0f61e6673e67151a7c8c0f9a09c7ea43fe2b5 in mainline

Relative hrtimers with a large timeout value might end up as negative
timer values, when the current time is added in hrtimer_start().

This in turn is causing the clockevents_set_next() function to set an
huge timeout and sleep for quite a long time when we have a clock
source which is capable of long sleeps like HPET. With PIT this almost
goes unnoticed as the maximum delta is ~27ms. The non-hrt/nohz code
sorts this out in the next timer interrupt, so we never noticed that
problem which has been there since the first day of hrtimers.

This bug became more apparent in 2.6.24 which activates HPET on more
hardware.

Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>wait_task_stopped(): pass correct exit_code to wait_noreap_copyout()</title>
<updated>2007-12-14T18:31:55+00:00</updated>
<author>
<name>Scott James Remnant</name>
<email>scott@ubuntu.com</email>
</author>
<published>2007-11-29T00:22:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=8722ad3d040169978c9706f51d1d43a70d9b6c89'/>
<id>8722ad3d040169978c9706f51d1d43a70d9b6c89</id>
<content type='text'>
patch e6ceb32aa25fc33f21af84cc7a32fe289b3e860c in mainline.

In wait_task_stopped() exit_code already contains the right value for the
si_status member of siginfo, and this is simply set in the non WNOWAIT
case.

If you call waitid() with a stopped or traced process, you'll get the signal
in siginfo.si_status as expected -- however if you call waitid(WNOWAIT) at the
same time, you'll get the signal &lt;&lt; 8 | 0x7f

Pass it unchanged to wait_noreap_copyout(); we would only need to shift it
and add 0x7f if we were returning it in the user status field and that
isn't used for any function that permits WNOWAIT.

Signed-off-by: Scott James Remnant &lt;scott@ubuntu.com&gt;
Signed-off-by: Oleg Nesterov &lt;oleg@tv-sign.ru&gt;
Cc: Roland McGrath &lt;roland@redhat.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch e6ceb32aa25fc33f21af84cc7a32fe289b3e860c in mainline.

In wait_task_stopped() exit_code already contains the right value for the
si_status member of siginfo, and this is simply set in the non WNOWAIT
case.

If you call waitid() with a stopped or traced process, you'll get the signal
in siginfo.si_status as expected -- however if you call waitid(WNOWAIT) at the
same time, you'll get the signal &lt;&lt; 8 | 0x7f

Pass it unchanged to wait_noreap_copyout(); we would only need to shift it
and add 0x7f if we were returning it in the user status field and that
isn't used for any function that permits WNOWAIT.

Signed-off-by: Scott James Remnant &lt;scott@ubuntu.com&gt;
Signed-off-by: Oleg Nesterov &lt;oleg@tv-sign.ru&gt;
Cc: Roland McGrath &lt;roland@redhat.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>fix param_sysfs_builtin name length check</title>
<updated>2007-11-21T17:25:53+00:00</updated>
<author>
<name>Jan Kiszka</name>
<email>jan.kiszka@web.de</email>
</author>
<published>2007-11-15T01:00:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=79d84e19d774dd71757b9dff90179ae593eaf550'/>
<id>79d84e19d774dd71757b9dff90179ae593eaf550</id>
<content type='text'>
patch 22800a2830ec07e7cc5c837999890ac47cc7f5de in mainline.

Commit faf8c714f4508207a9c81cc94dafc76ed6680b44 caused a regression:
parameter names longer than MAX_KBUILD_MODNAME will now be rejected,
although we just need to keep the module name part that short.  This patch
restores the old behaviour while still avoiding that memchr is called with
its length parameter larger than the total string length.

Signed-off-by: Jan Kiszka &lt;jan.kiszka@web.de&gt;
Cc: Dave Young &lt;hidave.darkstar@gmail.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch 22800a2830ec07e7cc5c837999890ac47cc7f5de in mainline.

Commit faf8c714f4508207a9c81cc94dafc76ed6680b44 caused a regression:
parameter names longer than MAX_KBUILD_MODNAME will now be rejected,
although we just need to keep the module name part that short.  This patch
restores the old behaviour while still avoiding that memchr is called with
its length parameter larger than the total string length.

Signed-off-by: Jan Kiszka &lt;jan.kiszka@web.de&gt;
Cc: Dave Young &lt;hidave.darkstar@gmail.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Fix compat futex hangs.</title>
<updated>2007-11-21T17:25:52+00:00</updated>
<author>
<name>David Miller</name>
<email>davem@davemloft.net</email>
</author>
<published>2007-11-13T07:59:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=52c7418eff50d66116b94c6e0a3cb08651dc49c3'/>
<id>52c7418eff50d66116b94c6e0a3cb08651dc49c3</id>
<content type='text'>
[FUTEX]: Fix address computation in compat code.

[ Upstream commit: 3c5fd9c77d609b51c0bab682c9d40cbb496ec6f1 ]

compat_exit_robust_list() computes a pointer to the
futex entry in userspace as follows:

	(void __user *)entry + futex_offset

'entry' is a 'struct robust_list __user *', and
'futex_offset' is a 'compat_long_t' (typically a 's32').

Things explode if the 32-bit sign bit is set in futex_offset.

Type promotion sign extends futex_offset to a 64-bit value before
adding it to 'entry'.

This triggered a problem on sparc64 running 32-bit applications which
would lock up a cpu looping forever in the fault handling for the
userspace load in handle_futex_death().

Compat userspace runs with address masking (wherein the cpu zeros out
the top 32-bits of every effective address given to a memory operation
instruction) so the sparc64 fault handler accounts for this by
zero'ing out the top 32-bits of the fault address too.

Since the kernel properly uses the compat_uptr interfaces, kernel side
accesses to compat userspace work too since they will only use
addresses with the top 32-bit clear.

Because of this compat futex layer bug we get into the following loop
when executing the get_user() load near the top of handle_futex_death():

1) load from address '0xfffffffff7f16bd8', FAULT
2) fault handler clears upper 32-bits, processes fault
   for address '0xf7f16bd8' which succeeds
3) goto #1

I want to thank Bernd Zeimetz, Josip Rodin, and Fabio Massimo Di Nitto
for their tireless efforts helping me track down this bug.

Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
[FUTEX]: Fix address computation in compat code.

[ Upstream commit: 3c5fd9c77d609b51c0bab682c9d40cbb496ec6f1 ]

compat_exit_robust_list() computes a pointer to the
futex entry in userspace as follows:

	(void __user *)entry + futex_offset

'entry' is a 'struct robust_list __user *', and
'futex_offset' is a 'compat_long_t' (typically a 's32').

Things explode if the 32-bit sign bit is set in futex_offset.

Type promotion sign extends futex_offset to a 64-bit value before
adding it to 'entry'.

This triggered a problem on sparc64 running 32-bit applications which
would lock up a cpu looping forever in the fault handling for the
userspace load in handle_futex_death().

Compat userspace runs with address masking (wherein the cpu zeros out
the top 32-bits of every effective address given to a memory operation
instruction) so the sparc64 fault handler accounts for this by
zero'ing out the top 32-bits of the fault address too.

Since the kernel properly uses the compat_uptr interfaces, kernel side
accesses to compat userspace work too since they will only use
addresses with the top 32-bit clear.

Because of this compat futex layer bug we get into the following loop
when executing the get_user() load near the top of handle_futex_death():

1) load from address '0xfffffffff7f16bd8', FAULT
2) fault handler clears upper 32-bits, processes fault
   for address '0xf7f16bd8' which succeeds
3) goto #1

I want to thank Bernd Zeimetz, Josip Rodin, and Fabio Massimo Di Nitto
for their tireless efforts helping me track down this bug.

Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>wait_task_stopped: Check p-&gt;exit_state instead of TASK_TRACED (CVE-2007-5500)</title>
<updated>2007-11-16T18:26:41+00:00</updated>
<author>
<name>Roland McGrath</name>
<email>roland@redhat.com</email>
</author>
<published>2007-11-14T06:11:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=5ef016ad9ba96a77a7249a2bd8d3196af5bfd920'/>
<id>5ef016ad9ba96a77a7249a2bd8d3196af5bfd920</id>
<content type='text'>
patch a3474224e6a01924be40a8255636ea5522c1023a in mainline

The original meaning of the old test (p-&gt;state &gt; TASK_STOPPED) was
"not dead", since it was before TASK_TRACED existed and before the
state/exit_state split.  It was a wrong correction in commit
14bf01bb0599c89fc7f426d20353b76e12555308 to make this test for
TASK_TRACED instead.  It should have been changed when TASK_TRACED
was introducted and again when exit_state was introduced.

Signed-off-by: Roland McGrath &lt;roland@redhat.com&gt;
Cc: Oleg Nesterov &lt;oleg@tv-sign.ru&gt;
Cc: Alexey Dobriyan &lt;adobriyan@sw.ru&gt;
Cc: Kees Cook &lt;kees@ubuntu.com&gt;
Acked-by: Scott James Remnant &lt;scott@ubuntu.com&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch a3474224e6a01924be40a8255636ea5522c1023a in mainline

The original meaning of the old test (p-&gt;state &gt; TASK_STOPPED) was
"not dead", since it was before TASK_TRACED existed and before the
state/exit_state split.  It was a wrong correction in commit
14bf01bb0599c89fc7f426d20353b76e12555308 to make this test for
TASK_TRACED instead.  It should have been changed when TASK_TRACED
was introducted and again when exit_state was introduced.

Signed-off-by: Roland McGrath &lt;roland@redhat.com&gt;
Cc: Oleg Nesterov &lt;oleg@tv-sign.ru&gt;
Cc: Alexey Dobriyan &lt;adobriyan@sw.ru&gt;
Cc: Kees Cook &lt;kees@ubuntu.com&gt;
Acked-by: Scott James Remnant &lt;scott@ubuntu.com&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>param_sysfs_builtin memchr argument fix</title>
<updated>2007-11-05T17:56:07+00:00</updated>
<author>
<name>Dave Young</name>
<email>hidave.darkstar@gmail.com</email>
</author>
<published>2007-10-18T10:05:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=b5f591838db12ca39e25b70278beec499fa56751'/>
<id>b5f591838db12ca39e25b70278beec499fa56751</id>
<content type='text'>
patch faf8c714f4508207a9c81cc94dafc76ed6680b44 in mainline.

If memchr argument is longer than strlen(kp-&gt;name), there will be some
weird result.

It will casuse duplicate filenames in sysfs for the "nousb".  kernel
warning messages are as bellow:

sysfs: duplicate filename 'usbcore' can not be created
WARNING: at fs/sysfs/dir.c:416 sysfs_add_one()
 [&lt;c01c4750&gt;] sysfs_add_one+0xa0/0xe0
 [&lt;c01c4ab8&gt;] create_dir+0x48/0xb0
 [&lt;c01c4b69&gt;] sysfs_create_dir+0x29/0x50
 [&lt;c024e0fb&gt;] create_dir+0x1b/0x50
 [&lt;c024e3b6&gt;] kobject_add+0x46/0x150
 [&lt;c024e2da&gt;] kobject_init+0x3a/0x80
 [&lt;c053b880&gt;] kernel_param_sysfs_setup+0x50/0xb0
 [&lt;c053b9ce&gt;] param_sysfs_builtin+0xee/0x130
 [&lt;c053ba33&gt;] param_sysfs_init+0x23/0x60
 [&lt;c024d062&gt;] __next_cpu+0x12/0x20
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052a856&gt;] do_initcalls+0x46/0x1e0
 [&lt;c01bdb12&gt;] create_proc_entry+0x52/0x90
 [&lt;c0158d4c&gt;] register_irq_proc+0x9c/0xc0
 [&lt;c01bda94&gt;] proc_mkdir_mode+0x34/0x50
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa92&gt;] kernel_init+0x62/0xb0
 [&lt;c0104f83&gt;] kernel_thread_helper+0x7/0x14
 =======================
kobject_add failed for usbcore with -EEXIST, don't try to register things with the same name in the same directory.
 [&lt;c024e466&gt;] kobject_add+0xf6/0x150
 [&lt;c053b880&gt;] kernel_param_sysfs_setup+0x50/0xb0
 [&lt;c053b9ce&gt;] param_sysfs_builtin+0xee/0x130
 [&lt;c053ba33&gt;] param_sysfs_init+0x23/0x60
 [&lt;c024d062&gt;] __next_cpu+0x12/0x20
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052a856&gt;] do_initcalls+0x46/0x1e0
 [&lt;c01bdb12&gt;] create_proc_entry+0x52/0x90
 [&lt;c0158d4c&gt;] register_irq_proc+0x9c/0xc0
 [&lt;c01bda94&gt;] proc_mkdir_mode+0x34/0x50
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa92&gt;] kernel_init+0x62/0xb0
 [&lt;c0104f83&gt;] kernel_thread_helper+0x7/0x14
 =======================
Module 'usbcore' failed to be added to sysfs, error number -17
The system will be unstable now.

Signed-off-by: Dave Young &lt;hidave.darkstar@gmail.com&gt;
Cc: Greg KH &lt;greg@kroah.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch faf8c714f4508207a9c81cc94dafc76ed6680b44 in mainline.

If memchr argument is longer than strlen(kp-&gt;name), there will be some
weird result.

It will casuse duplicate filenames in sysfs for the "nousb".  kernel
warning messages are as bellow:

sysfs: duplicate filename 'usbcore' can not be created
WARNING: at fs/sysfs/dir.c:416 sysfs_add_one()
 [&lt;c01c4750&gt;] sysfs_add_one+0xa0/0xe0
 [&lt;c01c4ab8&gt;] create_dir+0x48/0xb0
 [&lt;c01c4b69&gt;] sysfs_create_dir+0x29/0x50
 [&lt;c024e0fb&gt;] create_dir+0x1b/0x50
 [&lt;c024e3b6&gt;] kobject_add+0x46/0x150
 [&lt;c024e2da&gt;] kobject_init+0x3a/0x80
 [&lt;c053b880&gt;] kernel_param_sysfs_setup+0x50/0xb0
 [&lt;c053b9ce&gt;] param_sysfs_builtin+0xee/0x130
 [&lt;c053ba33&gt;] param_sysfs_init+0x23/0x60
 [&lt;c024d062&gt;] __next_cpu+0x12/0x20
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052a856&gt;] do_initcalls+0x46/0x1e0
 [&lt;c01bdb12&gt;] create_proc_entry+0x52/0x90
 [&lt;c0158d4c&gt;] register_irq_proc+0x9c/0xc0
 [&lt;c01bda94&gt;] proc_mkdir_mode+0x34/0x50
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa92&gt;] kernel_init+0x62/0xb0
 [&lt;c0104f83&gt;] kernel_thread_helper+0x7/0x14
 =======================
kobject_add failed for usbcore with -EEXIST, don't try to register things with the same name in the same directory.
 [&lt;c024e466&gt;] kobject_add+0xf6/0x150
 [&lt;c053b880&gt;] kernel_param_sysfs_setup+0x50/0xb0
 [&lt;c053b9ce&gt;] param_sysfs_builtin+0xee/0x130
 [&lt;c053ba33&gt;] param_sysfs_init+0x23/0x60
 [&lt;c024d062&gt;] __next_cpu+0x12/0x20
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052a856&gt;] do_initcalls+0x46/0x1e0
 [&lt;c01bdb12&gt;] create_proc_entry+0x52/0x90
 [&lt;c0158d4c&gt;] register_irq_proc+0x9c/0xc0
 [&lt;c01bda94&gt;] proc_mkdir_mode+0x34/0x50
 [&lt;c052aa30&gt;] kernel_init+0x0/0xb0
 [&lt;c052aa92&gt;] kernel_init+0x62/0xb0
 [&lt;c0104f83&gt;] kernel_thread_helper+0x7/0x14
 =======================
Module 'usbcore' failed to be added to sysfs, error number -17
The system will be unstable now.

Signed-off-by: Dave Young &lt;hidave.darkstar@gmail.com&gt;
Cc: Greg KH &lt;greg@kroah.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>genirq: suppress resend of level interrupts</title>
<updated>2007-11-05T17:56:06+00:00</updated>
<author>
<name>Thomas Gleixner</name>
<email>tglx@linutronix.de</email>
</author>
<published>2007-08-12T15:46:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=2f21ad6334146d5dd5f4bcbbe3eb0f8d343498b7'/>
<id>2f21ad6334146d5dd5f4bcbbe3eb0f8d343498b7</id>
<content type='text'>
patch 2464286ace55b3abddfb9cc30ab95e2dac1de9a6 in mainline.

Level type interrupts are resent by the interrupt hardware when they are
still active at irq_enable().

Suppress the resend mechanism for interrupts marked as level.

Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
patch 2464286ace55b3abddfb9cc30ab95e2dac1de9a6 in mainline.

Level type interrupts are resent by the interrupt hardware when they are
still active at irq_enable().

Suppress the resend mechanism for interrupts marked as level.

Signed-off-by: Thomas Gleixner &lt;tglx@linutronix.de&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
Cc: Chuck Ebbert &lt;cebbert@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</pre>
</div>
</content>
</entry>
</feed>
