From: Al Viro <viro@ZenIV.linux.org.uk>
To: Brian Gerst <brgerst@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
tglx@linutronix.de, mingo@redhat.com,
linux-kernel@vger.kernel.org
Subject: Re: what's papered over by set_fs(USER_DS) in amd64 signal delivery?
Date: Sat, 25 Sep 2010 06:20:54 +0100 [thread overview]
Message-ID: <20100925052054.GU19804@ZenIV.linux.org.uk> (raw)
In-Reply-To: <AANLkTikKtK1s8mGF4chhLtXRJW1G43BKAAY3wC-EVbQH@mail.gmail.com>
On Fri, Sep 24, 2010 at 11:51:11PM -0400, Brian Gerst wrote:
> > Again, I agree that it almost certainly can be dropped. ??I really wonder
> > about the history, though. ??It predates git and bk by far (late 1996).
> > Linus, do you have any recollection regarding that stuff?
> >
>
> In the beginning, the i386 kernel used a non-flat segmented memory
> layout. USER_[CD]S were 3GB segments at base 0, and KERNEL_[CD]S were
> 1GB segments at base 3GB. This meant that the kernel could not access
> userspace addresses without using a fs segment override (%fs was saved
> in pt_regs, reloaded with USER_DS on kernel entry, and restored on
> kernel exit). You had to reload %fs with KERNEL_DS for the *_user
> functions to address the kernel segment.
I know.
> v2.1.2 introduced the modern flat memory layout with 4GB segments at
> base 0. %fs no longer was used for userspace access, so it wasn't
> saved in pt_regs or touched in any way until a task switch. Instead
> of the hardware enforcing the limit, the check was moved to software.
Yes.
> Originally the signal handler had to set regs->xfs = USER_DS so that
> the signal handler had a known state when it ran. That had nothing to
> do with the kernel's userspace access mechanism. It was converted to
> do both the immediate reloading of the %fs register (since it was no
> longer saved in pt_regs and wouldn't get restored on kernel exit), and
> to a new set_fs(USER_DS) call which meant something completely
> different. That is the origin of the code we are trying to remove
> now.
That still makes no sense. 2.0 mechanism guaranteed that even if you forgot
to restore %fs to USER_DS, you wouldn't leak that to userland. But this
one didn't - each place like that became a roothole, no matter what you
did on signal delivery. Simply because there might have been no unblocked
signals with userland handlers. IOW, that set_fs() seems to have been
useless from the day 1, unless I'm missing something really subtle, like
e.g. some processes deliberately running (in 2.0) with %fs set to something
with lower limit, with signal handlers allowed to switch back to normal
for duration. And even that would've been broken, since there wouldn't be
a matching set_fs() in sigreturn()...
next prev parent reply other threads:[~2010-09-25 5:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-24 15:52 what's papered over by set_fs(USER_DS) in amd64 signal delivery? Al Viro
2010-09-24 16:07 ` Linus Torvalds
2010-09-24 16:57 ` Al Viro
2010-09-25 2:25 ` Brian Gerst
2010-09-25 2:48 ` Al Viro
2010-09-25 3:51 ` Brian Gerst
2010-09-25 5:20 ` Al Viro [this message]
2010-09-25 9:54 ` Brian Gerst
2010-09-26 9:13 ` Ingo Molnar
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=20100925052054.GU19804@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=brgerst@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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.