All of lore.kernel.org
 help / color / mirror / Atom feed
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>

  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.