All of lore.kernel.org
 help / color / mirror / Atom feed
From: Al Viro <viro@ZenIV.linux.org.uk>
To: Greentime Hu <green.hu@gmail.com>
Cc: greentime@andestech.com, linux-kernel@vger.kernel.org,
	arnd@arndb.de, linux-arch@vger.kernel.org, tglx@linutronix.de,
	jason@lakedaemon.net, marc.zyngier@arm.com, robh+dt@kernel.org,
	netdev@vger.kernel.org, Vincent Chen <vincentc@andestech.com>
Subject: Re: [PATCH 17/31] nds32: Signal handling support
Date: Thu, 9 Nov 2017 01:26:20 +0000	[thread overview]
Message-ID: <20171109012620.GY21978@ZenIV.linux.org.uk> (raw)
In-Reply-To: <82ac0fc50f8fcdaf423b6ef1a66ee4d1d88d366b.1510118606.git.green.hu@gmail.com>

On Wed, Nov 08, 2017 at 01:55:05PM +0800, Greentime Hu wrote:

> +static int restore_sigframe(struct pt_regs *regs,
> +			    struct rt_sigframe __user * sf)
> +{

[snip]

> +	err |= !valid_user_regs(regs);

IDGI...  Where do you modify ->ipsw at all and how can valid_user_regs() come
to be false here?

> +asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
> +{
> +	struct rt_sigframe __user *frame;
> +
> +	/* Always make any pending restarted system calls return -EINTR */
> +	current->restart_block.fn = do_no_restart_syscall;
> +
> +	/*
> +	 * Since we stacked the signal on a 64-bit boundary,
> +	 * then 'sp' should be two-word aligned here.  If it's
> +	 * not, then the user is trying to mess with us.
> +	 */
> +	if (regs->sp & 7)
> +		goto badframe;
> +
> +	frame = (struct rt_sigframe __user *)regs->sp;
> +
> +	if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
> +		goto badframe;
> +
> +	if (restore_sigframe(regs, frame))
> +		goto badframe;
> +
> +	if (restore_altstack(&frame->uc.uc_stack))
> +		goto badframe;
> +
> +	return regs->uregs[0];
> +
> +badframe:
> +	force_sig(SIGSEGV, current);
> +	return 0;
> +}

AFAICS, you are copying arm; take a good look at sys_rt_sigreturn_wrapper
there - specifically, the 'mov why, #0' part.  Consider what happens if
you get an interrupt at the moment when $r0 contains -ERESTARTSYS (for
example) and signal arrives while we are processing the interrupt.  It
will be handled on the way out, without any syscall restart crap ('why'
is 0 on that codepath).  So far, so good, but think what'll happen when
you are done with the signal handler.  sigreturn() is called, the values
we had stashed in sigcontext go back into registers (OK, pt_regs on
kernel stack that will be used to reload the registers on return to
userland)... and the signals that had been blocked for the duration of
handlers (see sa_mask in sigaction(2)) get unblocked.  And it turns
out that you have one of those pending - it had arrived while we'd been
in the handler.

Now we are fucked.  You have TIF_SIGPENDING set, so do_notify_resume()
is called.  And everything looks exactly as if you had a syscall restart
situation - regs->uregs[0] being one of -ERESTART... and 'syscall' flag
being true.  So we go into the second signal handler (as we ought to)
with saved ->ipc set 4 bytes back from where we were going to return.
It would've been the right thing to do if it *was* a syscall restart,
but we were returning to the location where the original interrupt
had caught us.

Result: with the right timing, an interrupt arriving when userland process
has $r0 equal -512 may lead to instruction pointer jumping 4 bytes back.
Pity the poor sod trying to debug that kind of breakage...

Restart should *NOT* be triggered upon sigreturn(2).

> +static int
> +setup_return(struct pt_regs *regs, struct ksignal *ksig, void __user * frame)
> +{
> +	unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler;
> +	unsigned long retcode;
> +
> +	/*
> +	 * Maybe we need to deliver a 32-bit signal to a 26-bit task.

Deliver to what, again?  That comment made sense (if rather sad one) on arm, but
what is it doing here?

> +static int do_signal(struct pt_regs *regs, int syscall)
> +{
> +	unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
> +	struct ksignal ksig;
> +	int restart = 0;
> +
> +	/*
> +	 * We want the common case to go fast, which
> +	 * is why we may in certain cases get here from
> +	 * kernel mode. Just return without doing anything
> +	 * if so.
> +	 */
> +	if (!user_mode(regs))
> +		return 0;

Which cases would those be?

  reply	other threads:[~2017-11-09  1:26 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-08  5:54 [PATCH 00/31] Andes(nds32) Linux Kernel Port Greentime Hu
2017-11-08  5:54 ` [PATCH 01/31] nds32: Assembly macros and definitions Greentime Hu
2017-11-08  5:54 ` [PATCH 02/31] nds32: Kernel booting and initialization Greentime Hu
2017-11-08 13:38   ` Rob Herring
2017-11-09  9:49     ` Greentime Hu
2017-11-08  5:54 ` [PATCH 03/31] nds32: Support early_printk Greentime Hu
2017-11-08  9:47   ` Tobias Klauser
2017-11-09  7:19     ` Greentime Hu
2017-11-08  5:54 ` [PATCH 04/31] nds32: Exception handling Greentime Hu
2017-11-08  8:23   ` Arnd Bergmann
     [not found]     ` <E26F4CF8B7DDDB4383A6C2D78D5C3CD56B4974CE@ATCPCS16.andestech.com>
2017-11-13 10:54       ` Fwd: FW: " Vincent Chen
2017-11-08  5:54 ` [PATCH 05/31] nds32: MMU definitions Greentime Hu
2017-11-08  8:36   ` Arnd Bergmann
2017-11-08  8:46     ` Greentime Hu
2017-11-08  5:54 ` [PATCH 06/31] nds32: MMU initialization Greentime Hu
2017-11-08  5:54 ` [PATCH 07/31] nds32: MMU fault handling and page table management Greentime Hu
2017-11-08  5:54 ` [PATCH 08/31] nds32: Cache and TLB routines Greentime Hu
2017-11-08  8:45   ` Arnd Bergmann
2017-11-08  9:01     ` Greentime Hu
2017-11-08  5:54 ` [PATCH 09/31] nds32: Process management Greentime Hu
2017-11-08  5:54 ` [PATCH 10/31] nds32: IRQ handling Greentime Hu
2017-11-08  8:49   ` Arnd Bergmann
2017-11-08  9:06     ` Greentime Hu
2017-11-08  5:54 ` [PATCH 11/31] nds32: Atomic operations Greentime Hu
2017-11-08  8:54   ` Arnd Bergmann
2017-11-08  9:32     ` vincentc
2017-11-08  9:32       ` vincentc
2017-11-20 14:29   ` Will Deacon
2017-11-22  3:02     ` Vincent Chen
2017-11-08  5:55 ` [PATCH 12/31] nds32: Device specific operations Greentime Hu
2017-11-08  9:04   ` Arnd Bergmann
2017-11-09  7:04     ` Greentime Hu
2017-11-10 16:07       ` Greentime Hu
2017-11-10 16:14         ` Arnd Bergmann
2017-11-22 10:02           ` Greentime Hu
2017-11-08  5:55 ` [PATCH 13/31] nds32: DMA mapping API Greentime Hu
2017-11-08  9:09   ` Arnd Bergmann
2017-11-09  7:12     ` Greentime Hu
2017-11-09 10:14       ` Arnd Bergmann
2017-11-10  8:13         ` Greentime Hu
2017-11-08  5:55 ` [PATCH 14/31] nds32: ELF definitions Greentime Hu
2017-11-08  5:55 ` [PATCH 15/31] nds32: System calls handling Greentime Hu
2017-11-08  9:30   ` Arnd Bergmann
     [not found]     ` <E26F4CF8B7DDDB4383A6C2D78D5C3CD56B497241@ATCPCS16.andestech.com>
2017-11-13  2:51       ` Fwd: FW: " Vincent Chen
2017-11-13 11:42         ` Arnd Bergmann
2017-11-22  3:13           ` Vincent Chen
2017-11-08  5:55 ` [PATCH 16/31] nds32: VDSO support Greentime Hu
2017-11-08  9:37   ` Arnd Bergmann
2017-11-08 20:00     ` Deepa Dinamani
2017-11-08 20:06       ` Arnd Bergmann
2017-11-08 20:14         ` Deepa Dinamani
2017-11-08  5:55 ` [PATCH 17/31] nds32: Signal handling support Greentime Hu
2017-11-09  1:26   ` Al Viro [this message]
     [not found]     ` <E26F4CF8B7DDDB4383A6C2D78D5C3CD56B497460@ATCPCS16.andestech.com>
2017-11-13  2:34       ` Fwd: FW: " Vincent Chen
2017-11-08  5:55 ` [PATCH 18/31] nds32: Library functions Greentime Hu
2017-11-08  9:45   ` Arnd Bergmann
2017-11-09  0:40   ` Al Viro
     [not found]     ` <E26F4CF8B7DDDB4383A6C2D78D5C3CD56B497559@ATCPCS16.andestech.com>
2017-11-14  4:47       ` Fwd: FW: " Vincent Chen
2017-11-18  2:44         ` Al Viro
2017-11-08  5:55 ` [PATCH 19/31] nds32: Debugging support Greentime Hu
2017-11-08  5:55 ` [PATCH 20/31] nds32: L2 cache support Greentime Hu
2017-11-08  9:48   ` Arnd Bergmann
2017-11-09  7:24     ` Greentime Hu
2017-11-08  5:55 ` [PATCH 21/31] nds32: Loadable modules Greentime Hu
2017-11-08  5:55 ` [PATCH 22/31] nds32: Generic timers support Greentime Hu
2017-11-08  5:55 ` [PATCH 23/31] nds32: Device tree support Greentime Hu
2017-11-08  9:53   ` Arnd Bergmann
2017-11-09  7:48     ` Greentime Hu
2017-11-08  5:55 ` [PATCH 24/31] nds32: Miscellaneous header files Greentime Hu
2017-11-08  9:57   ` Arnd Bergmann
2017-11-08  5:55 ` [PATCH 25/31] nds32: defconfig Greentime Hu
2017-11-08 10:03   ` Arnd Bergmann
2017-11-09  8:00     ` Greentime Hu
2017-11-09 10:20       ` Arnd Bergmann
2017-11-10  8:16         ` Greentime Hu
2017-11-08  5:55 ` [PATCH 26/31] nds32: Build infrastructure Greentime Hu
2017-11-08 10:16   ` Arnd Bergmann
2017-11-09  9:02     ` Greentime Hu
2017-11-09 10:33       ` Arnd Bergmann
2017-11-10  8:26         ` Greentime Hu
2017-11-17 12:39           ` Greentime Hu
2017-11-17 12:50             ` Arnd Bergmann
2017-11-17 13:50               ` Greentime Hu
2017-11-13 10:45     ` Geert Uytterhoeven
2017-11-13 10:45       ` Geert Uytterhoeven
2017-11-16 10:03       ` Greentime Hu
2017-11-16 10:25         ` Arnd Bergmann
2017-11-17 13:53           ` Greentime Hu
2017-11-08  5:55 ` [PATCH 27/31] dt-bindings: interrupt-controller: Andestech Internal Vector Interrupt Controller Greentime Hu
2017-11-08 13:25   ` Rob Herring
2017-11-09  9:43     ` Greentime Hu
2017-11-08  5:55 ` [PATCH 28/31] irqchip: Andestech Internal Vector Interrupt Controller driver Greentime Hu
2017-11-08 14:24   ` Marc Zyngier
2017-11-09 10:10     ` Greentime Hu
2017-11-08  5:55 ` [PATCH 29/31] MAINTAINERS: Add nds32 Greentime Hu
2017-11-08 13:31   ` Rob Herring
2017-11-09  9:46     ` Greentime Hu
2017-11-09 10:36       ` Arnd Bergmann
2017-11-14 15:39         ` Joe Perches
2017-11-16 12:22           ` Greentime Hu
2017-11-08  5:55 ` [PATCH 30/31] dt-bindings: nds32 CPU Bindings Greentime Hu
2017-11-08 13:18   ` Rob Herring
2017-11-09  9:39     ` Greentime Hu
2017-11-09 13:57       ` Rob Herring
2017-11-09 13:57         ` Rob Herring
2017-11-10  6:22         ` Greentime Hu
2017-11-10  8:25           ` Arnd Bergmann
2017-11-10  8:43             ` Greentime Hu
2017-11-10  8:43               ` Greentime Hu
2017-11-08  5:55 ` [PATCH 31/31] net: faraday add nds32 support Greentime Hu
2017-11-08  8:32 ` [PATCH 00/31] Andes(nds32) Linux Kernel Port David Howells
2017-11-08  8:41   ` Greentime Hu
2017-11-08 10:18     ` Arnd Bergmann
2017-11-09  9:26       ` Greentime Hu
2017-11-08 10:26 ` Arnd Bergmann
2017-11-09  9:33   ` Greentime Hu

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=20171109012620.GY21978@ZenIV.linux.org.uk \
    --to=viro@zeniv.linux.org.uk \
    --cc=arnd@arndb.de \
    --cc=green.hu@gmail.com \
    --cc=greentime@andestech.com \
    --cc=jason@lakedaemon.net \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=netdev@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vincentc@andestech.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 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.