From patchwork Wed Aug 17 14:47:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 14705 Received: (qmail 11165 invoked by alias); 17 Aug 2016 14:47:45 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 11144 invoked by uid 89); 17 Aug 2016 14:47:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=no version=3.3.2 spammy=H*Ad:D*synopsys.com, D*synopsys.com, flock, fcntl64 X-HELO: mx1.redhat.com From: Jeff Layton To: libc-alpha@sourceware.org Cc: linux-fsdevel@vger.kernel.org, Michael Kerrisk , "Carlos O'Donell" , Yuriy Kolerov Subject: [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64 Date: Wed, 17 Aug 2016 10:47:31 -0400 Message-Id: <1471445251-2450-1-git-send-email-jlayton@redhat.com> 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. Reported-by: Cyril Hrubis Cc: Michael Kerrisk (man-pages) Cc: Carlos O'Donell Cc: Yuriy Kolerov Signed-off-by: Jeff Layton --- manual/examples/ofdlocks.c | 1 + manual/llio.texi | 8 +++++--- sysdeps/unix/sysv/linux/bits/fcntl-linux.h | 15 +++++++++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/manual/examples/ofdlocks.c b/manual/examples/ofdlocks.c index ba4f0ef4d237..6df18ce5c368 100644 --- a/manual/examples/ofdlocks.c +++ b/manual/examples/ofdlocks.c @@ -15,6 +15,7 @@ along with this program; if not, see . */ +/* Note that this must be built with -D_FILE_OFFSET_BITS=64 on 32-bit arch */ #define _GNU_SOURCE #include #include diff --git a/manual/llio.texi b/manual/llio.texi index 019dea2c3189..99c700833641 100644 --- a/manual/llio.texi +++ b/manual/llio.texi @@ -3907,9 +3907,11 @@ descriptor. Open file description locks use the same @code{struct flock} as process-associated locks as an argument (@pxref{File Locks}) and the -macros for the @code{command} values are also declared in the header file -@file{fcntl.h}. To use them, the macro @code{_GNU_SOURCE} must be -defined prior to including any header file. +macros for the @code{command} values are also declared in the header +file @file{fcntl.h}. To use them, the macro @code{_GNU_SOURCE} must be +defined prior to including any header file. Additionally, if building on +a 32-bit architecture, then large file offsets must also be enabled +by defining @code{_FILE_OFFSET_BITS == 64}. In contrast to process-associated locks, any @code{struct flock} used as an argument to open file description lock commands must have the @code{l_pid} diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h index 7e5b0aecdcb4..7f3c9fef627f 100644 --- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h +++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h @@ -127,11 +127,18 @@ This means that they are inherited across fork or clone with CLONE_FILES like BSD (flock) locks, and they are only released automatically when the last reference to the the file description against which they were acquired - is put. */ + is put. + + Note that the kernel does not support the legacy struct flock on 32-bit + arches with OFD locks. On those arches you need define both _GNU_SOURCE + and _FILE_OFFSET_BITS=64. + */ #ifdef __USE_GNU -# define F_OFD_GETLK 36 -# define F_OFD_SETLK 37 -# define F_OFD_SETLKW 38 +# if __WORDSIZE != 32 || defined __USE_FILE_OFFSET64 +# define F_OFD_GETLK 36 +# define F_OFD_SETLK 37 +# define F_OFD_SETLKW 38 +# endif #endif #ifdef __USE_LARGEFILE64