From: Jeff Layton <jlayton@redhat.com>
To: Florian Weimer <fweimer@redhat.com>, libc-alpha@sourceware.org
Cc: linux-fsdevel@vger.kernel.org,
Michael Kerrisk <mtk.manpages@gmail.com>,
Carlos O'Donell <carlos@redhat.com>,
Yuriy Kolerov <Yuriy.Kolerov@synopsys.com>
Subject: Re: [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64
Date: Wed, 17 Aug 2016 14:21:14 -0400 [thread overview]
Message-ID: <1471458074.3196.67.camel@redhat.com> (raw)
In-Reply-To: <a2cb8cef-26d6-fdb4-9071-e1ed8502d7ae@redhat.com>
On Wed, 2016-08-17 at 20:02 +0200, Florian Weimer wrote:
> On 08/17/2016 07:39 PM, Jeff Layton wrote:
> >
> > On Wed, 2016-08-17 at 19:34 +0200, Florian Weimer wrote:
> > >
> > > On 08/17/2016 04:47 PM, Jeff Layton wrote:
> > > >
> > > >
> > > > The Linux kernel expects a flock64 structure whenever you use
> > > > OFD locks
> > > > with fcntl64. Unfortunately, you can currently build a 32-bit
> > > > program
> > > > that passes in a struct flock when it calls fcntl64.
> > > >
> > > > Only define the F_OFD_* constants when __USE_FILE_OFFSET64 is
> > > > also
> > > > defined, so that the build fails in this situation rather than
> > > > producing a broken binary.
> > >
> > > Doesn't this affect legacy POSIX-style locks as well, under very
> > > similar
> > > circumstances?
> > >
> > >
> >
> > No. The kernel will decide which type of struct it is based on
> > whether
> > userland passes in F_SETLK or F_SETLK64.
>
> Let me see if I can sort this out. Is the situation like this?
>
> _FILE_OFFSET_… …BITS == 32 …BITS == 64
> struct … flock flock64 flock flock64
> fcntl (F_SETLK) ok BAD ok BAD
> fcntl (F_SETLK64) BAD ok ok ok
> fcntl (F_OFD_SETLK) BAD ok¹ ok ok
>
> ¹ is broken by your patch, right?
Not sure I 100% understand your chart, but if I do then I think it's
more like:
_FILE_OFFSET_… …BITS == 32 …BITS == 64
struct … flock flock64 flock flock64
fcntl (F_SETLK) ok BAD ok ok
fcntl (F_SETLK64) BAD ok ok ok
fcntl (F_OFD_SETLK) BAD ok¹ ok ok
struct flock and struct flock64 are generally equivalent when
_FILE_OFFSET_BITS==64.
I don't quite understand how ¹ would be broken by this patch. The idea
with the patch is to ensure that if you haven't defined
_FILE_OFFSET_BITS=64 on a 32 bit arch, that it's broken at compile time
instead of at runtime.
>
> Looking at the definition of struct flock and struct flock64, the
> risk
> is that application silently succeed in locking the wrong thing when
> using struct flock64 with a 32-it interface.
>
Yes. The basic problem is that the kernel will expect a struct flock64,
but if you don't set _FILE_OFFSET_BITS=64 glibc will pass in a legacy
struct flock instead. The kernel can then read beyond the end of the
struct.
The bytes in l_start and l_len will be slurped into the kernel's
l_start field. The pid and whatever junk is beyond the struct will be
in the l_len and pid fields.
It's also possible the program will get back EFAULT as well if
copy_from_user fails.
--
Jeff Layton <jlayton@redhat.com>
next prev parent reply other threads:[~2016-08-17 18:21 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-17 14:47 [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64 Jeff Layton
2016-08-17 15:44 ` Joseph Myers
2016-08-17 17:49 ` Jeff Layton
2016-08-17 17:56 ` Joseph Myers
2016-08-17 18:23 ` Jeff Layton
2016-08-17 16:13 ` Mike Frysinger
2016-08-17 17:34 ` Florian Weimer
2016-08-17 17:39 ` Jeff Layton
2016-08-17 18:02 ` Florian Weimer
2016-08-17 18:21 ` Jeff Layton [this message]
2016-08-17 18:51 ` Florian Weimer
2016-08-17 19:20 ` Jeff Layton
2016-08-18 8:44 ` Florian Weimer
2016-08-18 8:58 ` Andreas Schwab
2016-08-17 20:52 ` Andreas Schwab
2016-08-18 8:45 ` Florian Weimer
2016-08-17 18:43 ` Mike Frysinger
2016-08-17 19:15 ` Jeff Layton
2016-08-17 19:59 ` Michael Kerrisk (man-pages)
2016-08-17 20:05 ` Jeff Layton
2016-08-17 20:37 ` Mike Frysinger
2016-08-17 20:57 ` Jeff Layton
2016-08-17 21:35 ` Mike Frysinger
2016-08-17 21:48 ` Jeff Layton
2016-08-18 9:00 ` Florian Weimer
2016-08-23 11:03 ` Cyril Hrubis
2016-08-23 11:36 ` Jeff Layton
2016-08-23 11:38 ` Cyril Hrubis
2016-08-23 21:10 ` Michael Kerrisk (man-pages)
2016-11-14 13:45 ` Cyril Hrubis
2016-11-22 18:41 ` Florian Weimer
2016-08-18 8:57 ` Florian Weimer
2016-08-17 20:03 ` Mike Frysinger
2016-08-17 21:30 ` Cyril Hrubis
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=1471458074.3196.67.camel@redhat.com \
--to=jlayton@redhat.com \
--cc=Yuriy.Kolerov@synopsys.com \
--cc=carlos@redhat.com \
--cc=fweimer@redhat.com \
--cc=libc-alpha@sourceware.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=mtk.manpages@gmail.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 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.