[glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64

Florian Weimer fweimer@redhat.com
Wed Aug 17 18:02:00 GMT 2016


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?

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.

Thanks,
Florian



More information about the Libc-alpha mailing list