From: Peter Collingbourne <pcc@google.com>
To: Dave Martin <Dave.Martin@arm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Andrey Konovalov <andreyknvl@google.com>,
Kevin Brodsky <kevin.brodsky@arm.com>,
Oleg Nesterov <oleg@redhat.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>,
Will Deacon <will@kernel.org>,
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 19:28:46 -0700 [thread overview]
Message-ID: <CAMn1gO7VWBcbMvqNeyBdfpO71kfhrZbHwkOC0JeSX13_HUMmWA@mail.gmail.com> (raw)
In-Reply-To: <20200520092558.GI5031@arm.com>
On Wed, May 20, 2020 at 2:26 AM Dave Martin <Dave.Martin@arm.com> wrote:
>
> 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?
I think I've come up with a way that doesn't seem to be too invasive.
See patch #1 of the series that I'm about to send out.
> > 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.
Not as far as I can tell. There does appear to be prioritisation for
synchronous signals [1] but as far as I can tell nothing to
distinguish one of these signals from one with the same signal number
sent from userspace (e.g. via kill(2)).
Peter
[1] https://github.com/torvalds/linux/blob/b85051e755b0e9d6dd8f17ef1da083851b83287d/kernel/signal.c#L222
_______________________________________________
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-21 2:29 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
2020-05-21 2:28 ` Peter Collingbourne [this message]
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=CAMn1gO7VWBcbMvqNeyBdfpO71kfhrZbHwkOC0JeSX13_HUMmWA@mail.gmail.com \
--to=pcc@google.com \
--cc=Dave.Martin@arm.com \
--cc=andreyknvl@google.com \
--cc=catalin.marinas@arm.com \
--cc=ebiederm@xmission.com \
--cc=eugenis@google.com \
--cc=kcc@google.com \
--cc=kevin.brodsky@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=oleg@redhat.com \
--cc=rth@twiddle.net \
--cc=vincenzo.frascino@arm.com \
--cc=will@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).