From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com ([209.132.183.28]:36572 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752406AbcHQSCP (ORCPT ); Wed, 17 Aug 2016 14:02:15 -0400 Subject: Re: [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64 To: Jeff Layton , libc-alpha@sourceware.org References: <1471445251-2450-1-git-send-email-jlayton@redhat.com> <024779d0-2800-8e43-b65c-180eca70cc8b@redhat.com> <1471455596.3196.36.camel@redhat.com> Cc: linux-fsdevel@vger.kernel.org, Michael Kerrisk , "Carlos O'Donell" , Yuriy Kolerov From: Florian Weimer Message-ID: Date: Wed, 17 Aug 2016 20:02:11 +0200 MIME-Version: 1.0 In-Reply-To: <1471455596.3196.36.camel@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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