From: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
To: Alex Smith <alex.smith@imgtec.com>, Ralf Baechle <ralf@linux-mips.org>
Cc: <linux-mips@linux-mips.org>, <stable@vger.kernel.org>,
Alex Smith <alex@alex-smith.me.uk>
Subject: Re: MIPS: O32/32-bit: Fix bug which can cause incorrect system call restarts
Date: Thu, 17 Jul 2014 12:49:26 +0100 [thread overview]
Message-ID: <53C7B846.6040803@imgtec.com> (raw)
In-Reply-To: <1392648557-7174-1-git-send-email-alex.smith@imgtec.com>
On 17/02/14 14:49, Alex Smith wrote:
> On 32-bit/O32, pt_regs has a padding area at the beginning into which the
> syscall arguments passed via the user stack are copied. 4 arguments
> totalling 16 bytes are copied to offset 16 bytes into this area, however
> the area is only 24 bytes long. This means the last 2 arguments overwrite
> pt_regs->regs[{0,1}].
>
> If a syscall function returns an error, handle_sys stores the original
> syscall number in pt_regs->regs[0] for syscall restart. signal.c checks
> whether regs[0] is non-zero, if it is it will check whether the syscall
> return value is one of the ERESTART* codes to see if it must be
> restarted.
>
> Should a syscall be made that results in a non-zero value being copied
> off the user stack into regs[0], and then returns a positive (non-error)
> value that matches one of the ERESTART* error codes, this can be mistaken
> for requiring a syscall restart.
>
> While the possibility for this to occur has always existed, it is made
> much more likely to occur by commit 46e12c07b3b9 ("MIPS: O32 / 32-bit:
> Always copy 4 stack arguments."), since now every syscall will copy 4
> arguments and overwrite regs[0], rather than just those with 7 or 8
> arguments.
>
> Since that commit, booting Debian under a 32-bit MIPS kernel almost
> always results in a hang early in boot, due to a wait4 syscall returning
> a PID that matches one of the ERESTART* codes, which then causes an
> incorrect restart of the syscall.
>
> The problem is fixed by increasing the size of the padding area so that
> arguments copied off the stack will not overwrite pt_regs->regs[{0,1}].
> Also removed a comment in handle_sys which is no longer relevant after
> the aforementioned commit.
>
> Signed-off-by: Alex Smith <alex.smith@imgtec.com>
> Reviewed-by: Markos Chandras <markos.chandras@imgtec.com>
Tested-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: linux-mips@linux-mips.org
> Cc: stable@vger.kernel.org [3.13]
>
> ---
> arch/mips/include/asm/ptrace.h | 2 +-
> arch/mips/kernel/scall32-o32.S | 2 --
> arch/mips/kernel/smtc-asm.S | 4 ++--
> 3 files changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h
> index 7bba9da..6d019ca 100644
> --- a/arch/mips/include/asm/ptrace.h
> +++ b/arch/mips/include/asm/ptrace.h
> @@ -23,7 +23,7 @@
> struct pt_regs {
> #ifdef CONFIG_32BIT
> /* Pad bytes for argument save space on the stack. */
> - unsigned long pad0[6];
> + unsigned long pad0[8];
> #endif
>
> /* Saved main processor registers. */
> diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
> index a5b14f4..4220c2d 100644
> --- a/arch/mips/kernel/scall32-o32.S
> +++ b/arch/mips/kernel/scall32-o32.S
> @@ -66,8 +66,6 @@ NESTED(handle_sys, PT_SIZE, sp)
>
> /*
> * Ok, copy the args from the luser stack to the kernel stack.
> - * t3 is the precomputed number of instruction bytes needed to
> - * load or store arguments 6-8.
> */
>
> .set push
> diff --git a/arch/mips/kernel/smtc-asm.S b/arch/mips/kernel/smtc-asm.S
> index 2866863..c4f0cd9 100644
> --- a/arch/mips/kernel/smtc-asm.S
> +++ b/arch/mips/kernel/smtc-asm.S
> @@ -43,8 +43,8 @@ CAN WE PROVE THAT WE WON'T DO THIS IF INTS DISABLED??
> * to invoke the scheduler and return as appropriate.
> */
>
> -#define PT_PADSLOT4 (PT_R0-8)
> -#define PT_PADSLOT5 (PT_R0-4)
> +#define PT_PADSLOT4 (PT_R0-16)
> +#define PT_PADSLOT5 (PT_R0-12)
>
> .text
> .align 5
>
WARNING: multiple messages have this Message-ID (diff)
From: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
To: Alex Smith <alex.smith@imgtec.com>, Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org, stable@vger.kernel.org,
Alex Smith <alex@alex-smith.me.uk>
Subject: Re: MIPS: O32/32-bit: Fix bug which can cause incorrect system call restarts
Date: Thu, 17 Jul 2014 12:49:26 +0100 [thread overview]
Message-ID: <53C7B846.6040803@imgtec.com> (raw)
Message-ID: <20140717114926.32oY-ft36qGbSsT8O1-4LfM1GTQvPnoxhdy2fd53evo@z> (raw)
In-Reply-To: <1392648557-7174-1-git-send-email-alex.smith@imgtec.com>
On 17/02/14 14:49, Alex Smith wrote:
> On 32-bit/O32, pt_regs has a padding area at the beginning into which the
> syscall arguments passed via the user stack are copied. 4 arguments
> totalling 16 bytes are copied to offset 16 bytes into this area, however
> the area is only 24 bytes long. This means the last 2 arguments overwrite
> pt_regs->regs[{0,1}].
>
> If a syscall function returns an error, handle_sys stores the original
> syscall number in pt_regs->regs[0] for syscall restart. signal.c checks
> whether regs[0] is non-zero, if it is it will check whether the syscall
> return value is one of the ERESTART* codes to see if it must be
> restarted.
>
> Should a syscall be made that results in a non-zero value being copied
> off the user stack into regs[0], and then returns a positive (non-error)
> value that matches one of the ERESTART* error codes, this can be mistaken
> for requiring a syscall restart.
>
> While the possibility for this to occur has always existed, it is made
> much more likely to occur by commit 46e12c07b3b9 ("MIPS: O32 / 32-bit:
> Always copy 4 stack arguments."), since now every syscall will copy 4
> arguments and overwrite regs[0], rather than just those with 7 or 8
> arguments.
>
> Since that commit, booting Debian under a 32-bit MIPS kernel almost
> always results in a hang early in boot, due to a wait4 syscall returning
> a PID that matches one of the ERESTART* codes, which then causes an
> incorrect restart of the syscall.
>
> The problem is fixed by increasing the size of the padding area so that
> arguments copied off the stack will not overwrite pt_regs->regs[{0,1}].
> Also removed a comment in handle_sys which is no longer relevant after
> the aforementioned commit.
>
> Signed-off-by: Alex Smith <alex.smith@imgtec.com>
> Reviewed-by: Markos Chandras <markos.chandras@imgtec.com>
Tested-by: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: linux-mips@linux-mips.org
> Cc: stable@vger.kernel.org [3.13]
>
> ---
> arch/mips/include/asm/ptrace.h | 2 +-
> arch/mips/kernel/scall32-o32.S | 2 --
> arch/mips/kernel/smtc-asm.S | 4 ++--
> 3 files changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h
> index 7bba9da..6d019ca 100644
> --- a/arch/mips/include/asm/ptrace.h
> +++ b/arch/mips/include/asm/ptrace.h
> @@ -23,7 +23,7 @@
> struct pt_regs {
> #ifdef CONFIG_32BIT
> /* Pad bytes for argument save space on the stack. */
> - unsigned long pad0[6];
> + unsigned long pad0[8];
> #endif
>
> /* Saved main processor registers. */
> diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
> index a5b14f4..4220c2d 100644
> --- a/arch/mips/kernel/scall32-o32.S
> +++ b/arch/mips/kernel/scall32-o32.S
> @@ -66,8 +66,6 @@ NESTED(handle_sys, PT_SIZE, sp)
>
> /*
> * Ok, copy the args from the luser stack to the kernel stack.
> - * t3 is the precomputed number of instruction bytes needed to
> - * load or store arguments 6-8.
> */
>
> .set push
> diff --git a/arch/mips/kernel/smtc-asm.S b/arch/mips/kernel/smtc-asm.S
> index 2866863..c4f0cd9 100644
> --- a/arch/mips/kernel/smtc-asm.S
> +++ b/arch/mips/kernel/smtc-asm.S
> @@ -43,8 +43,8 @@ CAN WE PROVE THAT WE WON'T DO THIS IF INTS DISABLED??
> * to invoke the scheduler and return as appropriate.
> */
>
> -#define PT_PADSLOT4 (PT_R0-8)
> -#define PT_PADSLOT5 (PT_R0-4)
> +#define PT_PADSLOT4 (PT_R0-16)
> +#define PT_PADSLOT5 (PT_R0-12)
>
> .text
> .align 5
>
next prev parent reply other threads:[~2014-07-17 11:49 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-17 14:49 [PATCH] MIPS: O32/32-bit: Fix bug which can cause incorrect system call restarts Alex Smith
2014-02-17 14:49 ` Alex Smith
2014-07-17 11:49 ` Zubair Lutfullah Kakakhel [this message]
2014-07-17 11:49 ` Zubair Lutfullah Kakakhel
2014-07-17 16:50 ` Alex Smith
-- strict thread matches above, loose matches on Subject: below --
2014-07-23 13:40 Alex Smith
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=53C7B846.6040803@imgtec.com \
--to=zubair.kakakhel@imgtec.com \
--cc=alex.smith@imgtec.com \
--cc=alex@alex-smith.me.uk \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
--cc=stable@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.