From: Dave Martin <Dave.Martin@arm•com>
To: Will Deacon <will@kernel•org>
Cc: Andrey Konovalov <andreyknvl@google•com>,
Kevin Brodsky <kevin.brodsky@arm•com>,
Kostya Serebryany <kcc@google•com>,
Linux ARM <linux-arm-kernel@lists•infradead.org>,
Catalin Marinas <catalin.marinas@arm•com>,
Vincenzo Frascino <vincenzo.frascino@arm•com>,
Peter Collingbourne <pcc@google•com>,
Evgenii Stepanov <eugenis@google•com>,
Richard Henderson <rth@twiddle•net>
Subject: Re: [PATCH v6] arm64: Expose FAR_EL1 tag bits in sigcontext
Date: Wed, 20 May 2020 10:26:00 +0100 [thread overview]
Message-ID: <20200520092558.GI5031@arm.com> (raw)
In-Reply-To: <20200520085502.GC24293@willie-the-truck>
On Wed, May 20, 2020 at 09:55:03AM +0100, Will Deacon wrote:
> On Tue, May 19, 2020 at 03:00:12PM -0700, Peter Collingbourne wrote:
> > On Mon, May 18, 2020 at 2:53 AM Dave Martin <Dave.Martin@arm•com> wrote:
> > > On Thu, May 14, 2020 at 05:58:21PM -0700, Peter Collingbourne wrote:
> > > > diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
> > > > index baa88dc02e5c..5867f2fdbe64 100644
> > > > --- a/arch/arm64/kernel/signal.c
> > > > +++ b/arch/arm64/kernel/signal.c
> > > > @@ -648,6 +648,7 @@ static int setup_sigframe(struct
> > > > rt_sigframe_user_layout *user,
> > > > __put_user_error(ESR_MAGIC, &esr_ctx->head.magic, err);
> > > > __put_user_error(sizeof(*esr_ctx), &esr_ctx->head.size, err);
> > > > __put_user_error(current->thread.fault_code,
> > > > &esr_ctx->esr, err);
> > > > + current->thread.fault_code = 0;
> > >
> > > Perhaps, but we'd need to be careful. For example, can we run out of
> > > user stack before this and deliver a SIGSEGV, but with the old
> > > fault_code still set? Then we'd emit the old fault code with the
> > > new "can't deliver signal" signal, which doesn't make sense.
> > >
> > > Stuff may also go wrong with signal prioritisation.
> > >
> > > If a higher-priority signal (say SIGINT) comes in after a data abort
> > > enters the kernel but before the resulting SIGSEGV is dequeued for
> > > delivery, wouldn't we deliver SIGINT first, with the bogus fault code?
> > > With your change we'd then have cleared the fault code by the time we
> > > deliver the SIGSEGV it actually relates to, if I've understood right.
> > >
> > > Today, I think we just attach that fault code to every signal that's
> > > delivered until something overwrites or resets it, which means that
> > > a signal that needs fault_code gets it, at the expense of attaching
> > > it to a bunch of other random signals too.
> > >
> > >
> > > Checking the signal number and si_code might help us to know what we
> > > should be doing with fault_code. We need to have sure userspace can't
> > > trick us with a non kernel generated signal here. It would also be
> > > necessary to check how PTRACE_SETSIGINFO interacts with this.
> >
> > With these possible interactions in mind I think we should store the
> > fault code and fault address in kernel_siginfo instead of
> > thread_struct (and clear these fields when we receive a siginfo from
> > userspace, i.e. in copy_siginfo_from_user which is used by
> > ptrace(PTRACE_SETSIGINFO) among other places). That way, the
> > information is clearly associated with the signal itself and not the
> > thread, so we don't need to worry about our signal being delivered out
> > of order.
>
> Hmm, I can't see a way to do that that isn't horribly invasive in the core
> signal code. Can you?
>
> But generally, I agree: the per-thread handling of fault_address and
> fault_code appears to be quite broken in the face of signal prioritisation
> and signals that don't correspond directly to hardware trap. It would be
> nice to have some tests for this...
>
> If we want to pile on more bodges, perhaps we could stash the signal number
> to which the fault_{address,code} relate, and then check that at delivery
> and clear on a match. I hate it.
I agree with Daniel's suggestion in principle, but I was also concerned
about whether it would be too invasive elsewhere.
Question though: does the core code take special care to make sure that
a force_sig cannot be outprioritised by a regular signal? If so,
perhaps we get away with it. I ask this, because the same same issue
may be hitting other arches otherwise.
Cheers
---Dave
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists•infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-05-20 9:26 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-12 17:17 [PATCH] arm64: Expose original FAR_EL1 value in sigcontext Peter Collingbourne
2020-03-25 13:10 ` Catalin Marinas
2020-03-25 17:41 ` Peter Collingbourne
2020-03-25 17:40 ` [PATCH v2] " Peter Collingbourne
2020-03-26 16:45 ` Catalin Marinas
2020-03-27 7:56 ` Will Deacon
2020-03-27 11:39 ` Catalin Marinas
2020-03-27 19:26 ` Peter Collingbourne
2020-03-27 19:19 ` [PATCH v3] " Peter Collingbourne
2020-04-22 14:25 ` Catalin Marinas
2020-04-29 21:08 ` Will Deacon
2020-04-29 21:42 ` Peter Collingbourne
2020-05-04 17:03 ` Will Deacon
2020-05-07 17:57 ` [PATCH v4] arm64: Expose FAR_EL1 tag bits " Peter Collingbourne
2020-05-08 2:01 ` [PATCH v5] " Peter Collingbourne
2020-05-12 16:25 ` Catalin Marinas
2020-05-13 18:09 ` [PATCH v6] " Peter Collingbourne
2020-05-13 20:28 ` Dave Martin
2020-05-15 0:58 ` Peter Collingbourne
2020-05-18 9:53 ` Dave Martin
2020-05-19 22:00 ` Peter Collingbourne
2020-05-20 8:55 ` Will Deacon
2020-05-20 9:26 ` Dave Martin [this message]
2020-05-21 2:28 ` Peter Collingbourne
2020-05-21 2:29 ` [PATCH v6 0/3] " Peter Collingbourne
2020-05-21 2:29 ` [PATCH v6 1/3] signal: Allow architectures to store arch-specific data in kernel_siginfo Peter Collingbourne
2020-05-21 2:29 ` [PATCH v6 2/3] arm64: Move fault address and fault code into kernel_siginfo Peter Collingbourne
2020-05-21 13:34 ` kbuild test robot
2020-05-21 2:29 ` [PATCH v6 3/3] arm64: Expose FAR_EL1 tag bits in sigcontext Peter Collingbourne
2020-05-21 12:35 ` [PATCH v6] " Eric W. Biederman
2020-05-21 18:03 ` Peter Collingbourne
2020-05-21 19:24 ` Eric W. Biederman
2020-05-21 20:48 ` Peter Collingbourne
2020-06-08 18:12 ` Peter Collingbourne
2020-06-08 18:14 ` [PATCH v7] arm64: Expose FAR_EL1 tag bits in siginfo Peter Collingbourne
[not found] ` <20200623020134.16655-1-pcc@google.com>
[not found] ` <87sgemrlgc.fsf@x220.int.ebiederm.org>
2020-06-23 14:38 ` [PATCH v8] " Dave Martin
2020-06-23 17:47 ` Eric W. Biederman
2020-06-24 0:40 ` Peter Collingbourne
2020-06-24 9:28 ` Dave Martin
2020-06-24 16:51 ` Peter Collingbourne
2020-06-24 17:12 ` Dave Martin
2020-06-24 19:51 ` Peter Collingbourne
2020-07-06 16:41 ` Dave Martin
2020-07-06 19:20 ` Peter Collingbourne
2020-07-07 14:19 ` Dave Martin
2020-07-07 19:07 ` Peter Collingbourne
2020-07-08 11:00 ` Dave Martin
2020-07-08 13:58 ` Dave Martin
2020-07-08 22:21 ` Peter Collingbourne
2020-07-13 13:24 ` Dave Martin
2020-07-13 20:50 ` Peter Collingbourne
2020-07-14 17:36 ` Dave Martin
2020-08-18 3:16 ` Peter Collingbourne
2020-08-18 13:50 ` Dave Martin
2020-06-23 14:57 ` Dave Martin
2020-05-26 13:03 ` [PATCH v6] arm64: Expose FAR_EL1 tag bits in sigcontext Dave Martin
2020-04-30 9:50 ` [PATCH v3] arm64: Expose original FAR_EL1 value " Catalin Marinas
2020-04-30 9:59 ` Will Deacon
2020-04-30 13:34 ` Catalin Marinas
2020-05-04 10:19 ` Dave Martin
2020-05-07 17:55 ` Peter Collingbourne
2020-05-13 17:27 ` Dave Martin
2020-05-13 18:00 ` Peter Collingbourne
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=20200520092558.GI5031@arm.com \
--to=dave.martin@arm$(echo .)com \
--cc=andreyknvl@google$(echo .)com \
--cc=catalin.marinas@arm$(echo .)com \
--cc=eugenis@google$(echo .)com \
--cc=kcc@google$(echo .)com \
--cc=kevin.brodsky@arm$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=pcc@google$(echo .)com \
--cc=rth@twiddle$(echo .)net \
--cc=vincenzo.frascino@arm$(echo .)com \
--cc=will@kernel$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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