From: Andi Kleen <ak@muc.de>
To: sfr@canb.auug.org.au
Cc: ak@muc.de, anton@samba.org, davem@redhat.com, davidm@hpl.hp.com,
linux-kernel@vger.kernel.org, matthew@wil.cx, ralf@gnu.org,
schwidefsky@de.ibm.com, torvalds@transmeta.com
Subject: Re: [PATCH][COMPAT] compat_sys_fcntl{,64} 1/9 Generic part
Date: Fri, 28 Feb 2003 11:36:09 +0100 [thread overview]
Message-ID: <20030228103609.GA29955@averell> (raw)
In-Reply-To: <200302280950.h1S9oZdx014060@supreme.pcug.org.au>
On Fri, Feb 28, 2003 at 10:50:35AM +0100, sfr@canb.auug.org.au wrote:
> >
> > On Fri, Feb 28, 2003 at 05:33:49AM +0100, Stephen Rothwell wrote:
> > > +static int get_compat_flock(struct flock *kfl, struct compat_flock *ufl)
> > > +{
> > > + if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)) ||
> > > + __get_user(kfl->l_type, &ufl->l_type) ||
> > > + __get_user(kfl->l_whence, &ufl->l_whence) ||
> > > + __get_user(kfl->l_start, &ufl->l_start) ||
> > > + __get_user(kfl->l_len, &ufl->l_len) ||
> > > + __get_user(kfl->l_pid, &ufl->l_pid))
> >
> > Perhaps there should be really a big fat comment on top of compat.c
> > that it depends on a hole on __PAGE_OFFSET if the arch allows passing
> > 64bit pointers to the compat functions.
>
> One of my tasks is to document all the assumptions in hte comapt code
> (and there a a few - and I find more as I go :-)). However, could you
> elaborate a bit here - do you mean passing 64 bit pointers from user mode?
On some architectures it may be possible to smuggle 64bit pointers into
function arguments of the 32bit emulation. It should be able to handle
that without security holes.
e.g. on x86-64 it was for some time using ptrace - you could do
a syscall trace and restart a system call and modify the input arguments
again to contain 64bit pointers. I closed this, but there may be similar
holes on other ports. IMHO the 32bit emulation layer should be 64bit
input argument clean to avoid such subtle problems.
Now there used to be some code that did:
if (get_user(a, &userstruct->firstmember) ||
__get_user(b, &userstruct->secondmember))
return -EFAULT;
Assuming that the access_ok in get_user for sizeof(firstmember) covers
secondmember too which doesn't do access_ok in __get_user. This only
works assuming it should handle 64bit pointers when there is a memory
hole at the end of the user process space, otherwise it could
access kernel pages directly after TASK_SIZE. x86-64 has a big enough
hole there, i assume sparc64 and ia64 have too, but i don't know
about the other 64bit ports.
Actually your fcntl code is ok in this regard because it
uses access_ok with the correct argument, but other code sometimes doesn't.
> > > +asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
> > > + unsigned long arg)
> > > +{
> > > + if ((cmd == F_GETLK64) || (cmd == F_SETLK64) || (cmd == F_SETLKW64))
> > > + return -EINVAL;
> >
> > That won't work for IA32 emulation. There are programs that call
> > old style fcntl() with F_*LK64. Just drop the if here.
>
> I was going to elaborate on this when I sent the x86_64 part of the patch.
> If you read the "normal" kernel fcntl function, it does NOT accept
> F_GETLK64, F_SETLK64 or F_SETLKW64 through the fcntl sys call only
> through the fcntl64 syscall. So any program that does call the old
> style fcntl() with one of those will fail on ia32 - which is what you are
> trying to emulate.
Are you sure? I thought it did. But perhaps I'm confusing it with
fcntl64 here. fcntl64 definitely needs to accept the old style calls
(I remember debugging a problem in some application that relied on that)
-Andi
next prev parent reply other threads:[~2003-02-28 10:26 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-02-28 9:50 [PATCH][COMPAT] compat_sys_fcntl{,64} 1/9 Generic part sfr
2003-02-28 10:36 ` Andi Kleen [this message]
2003-03-01 9:12 ` Anton Blanchard
-- strict thread matches above, loose matches on Subject: below --
2003-03-11 12:20 Martin Schwidefsky
2003-03-12 4:44 ` Stephen Rothwell
2003-03-12 5:02 ` Linus Torvalds
2003-03-12 5:22 ` Stephen Rothwell
2003-03-12 5:26 ` Linus Torvalds
2003-03-12 5:57 ` Stephen Rothwell
2003-03-12 11:46 ` David S. Miller
2003-03-11 0:41 Stephen Rothwell
2003-03-10 12:43 Arnd Bergmann
2003-03-04 5:58 Stephen Rothwell
2003-02-28 4:33 Stephen Rothwell
2003-02-28 8:08 ` Andi Kleen
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=20030228103609.GA29955@averell \
--to=ak@muc.de \
--cc=anton@samba.org \
--cc=davem@redhat.com \
--cc=davidm@hpl.hp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew@wil.cx \
--cc=ralf@gnu.org \
--cc=schwidefsky@de.ibm.com \
--cc=sfr@canb.auug.org.au \
--cc=torvalds@transmeta.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox