From: ebiederm@xmission.com (Eric W. Biederman)
To: Borislav Petkov <bp@alien8.de>
Cc: Jiashuo Liang <liangjs@pku.edu.cn>,
Dave Hansen <dave.hansen@linux.intel.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] signal/x86: Don't send SIGSEGV twice on SEGV_PKUERR
Date: Thu, 03 Jun 2021 16:31:46 -0500 [thread overview]
Message-ID: <87lf7qocsd.fsf@disp2133> (raw)
In-Reply-To: <YLkhV+lSqXlcfUc5@zn.tnic> (Borislav Petkov's message of "Thu, 3 Jun 2021 20:37:11 +0200")
Borislav Petkov <bp@alien8.de> writes:
> On Tue, Jun 01, 2021 at 04:52:03PM +0800, Jiashuo Liang wrote:
>> Before this patch, the __bad_area_nosemaphore function calls both
>> force_sig_pkuerr and force_sig_fault when handling SEGV_PKUERR. This does
>> not cause problems because the second signal is filtered by the
>> legacy_queue check in __send_signal.
>
> I'm likely missing something but the first signal gets filtered by that
> same legacy_queue() check too, no?
>
> Because both calls end up in
>
> force_sig_info_to_task(info, current);
>
> with the info struct populated with:
>
> info.si_signo = SIGSEGV;
> info.si_errno = 0;
> info.si_code = SEGV_PKUERR;
> info.si_addr = addr;
> info.si_pkey = pkey;
>
> except the second call - force_sig_fault() - doesn't put pkey in
> ->si_pkey.
>
> So what's up?
There are two ways signals get delivered. The old fashioned way in the
signal bitmap, and the new fangled way by queuing sigqueue_info. In the
old fashioned way there is no information except that the signal itself
was delivered, and if the signal is sent twice it is impossible to find
out. In the new fangled way because the sigqueue_info can vary between
different times a signal is sent you can both see that a signal was
delivered twice (because there are two distinct entries in the queue),
but also possibly tell those two times a signal was sent apart.
The new real time signals can queue as many sigqueue_info's as their
rlimit allows. The old signals are limited to exactly one sigqueue_info
per signal number.
In this case the legacy_queue check tests to see if the signal is
already pending (present in the signal bitmap) and not a new real time
signal (which means only one sigqueue_info entry is allowed in the
signal queue).
Or in short I think everything turns out ok because the first signal is
delivered, and the second just happens to get dropped as a duplicate by
__send_signal. That is fragile and confusing to depend on so we should
just fix the code to not send the wrong signal.
> Thx.
I hope that clears things up.
Eric
next prev parent reply other threads:[~2021-06-03 21:33 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-01 8:52 [PATCH] signal/x86: Don't send SIGSEGV twice on SEGV_PKUERR Jiashuo Liang
2021-06-02 18:42 ` Eric W. Biederman
2021-06-02 19:02 ` Borislav Petkov
2021-06-03 18:37 ` Borislav Petkov
2021-06-03 21:31 ` Eric W. Biederman [this message]
2021-06-04 13:06 ` Borislav Petkov
2021-06-04 14:33 ` Eric W. Biederman
2021-06-04 14:54 ` Borislav Petkov
2021-06-04 13:26 ` [tip: x86/urgent] x86/fault: " tip-bot2 for Jiashuo Liang
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=87lf7qocsd.fsf@disp2133 \
--to=ebiederm@xmission.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=liangjs@pku.edu.cn \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@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