From patchwork Thu Aug 18 18:03:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 9289177 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8EA656086A for ; Fri, 19 Aug 2016 02:24:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7D31C2875B for ; Fri, 19 Aug 2016 02:24:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 71C8E290FA; Fri, 19 Aug 2016 02:24:53 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, URIBL_RED autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 01EBA2915A for ; Fri, 19 Aug 2016 02:24:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754014AbcHSCXm (ORCPT ); Thu, 18 Aug 2016 22:23:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35510 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753871AbcHSCWc (ORCPT ); Thu, 18 Aug 2016 22:22:32 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2F63E32B0C6; Thu, 18 Aug 2016 18:03:19 +0000 (UTC) Received: from tlielax.poochiereds.net (ovpn-116-26.rdu2.redhat.com [10.10.116.26]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7II3HaP013172; Thu, 18 Aug 2016 14:03:17 -0400 From: Jeff Layton To: libc-alpha@sourceware.org Cc: linux-fsdevel@vger.kernel.org, Michael Kerrisk , Yuriy Kolerov , Mike Frysinger , Joseph Myers , Christoph Hellwig Subject: [glibc PATCHv2] fcntl: don't define OFD lock constants for 32-bit builds with small file offsets Date: Thu, 18 Aug 2016 14:03:16 -0400 Message-Id: <1471543396-23273-1-git-send-email-jlayton@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 18 Aug 2016 18:03:19 +0000 (UTC) Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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, which will typically make the program fail (or crash). Only define the F_OFD_* command constants when large file offsets are enabled, either by virtue of being on a 64-bit arch, or by defining _FILE_OFFSET_BITS=64. By doing this, we ensure that such builds will break instead of generating a binary that doesn't behave as expected. I think this is the simplest option all around, and shouldn't cause any builds to break whose applications are not already broken. Note too that there is a corresponding manpage patch already proposed by Cyril. Reported-by: Cyril Hrubis Cc: Michael Kerrisk (man-pages) Cc: Yuriy Kolerov Cc: Mike Frysinger Cc: Joseph Myers Cc: Christoph Hellwig Signed-off-by: Jeff Layton --- ChangeLog | 6 ++++++ manual/examples/ofdlocks.c | 4 ++++ manual/llio.texi | 8 +++++--- sysdeps/unix/sysv/linux/bits/fcntl-linux.h | 14 ++++++++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 59c68d8b9d0d..c2f8ef94dcb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-08-18 Jeff Layton + + * sysdeps/unix/sysv/linux/bits/fcntl-linux.h: only define F_OFD_* + constants when off_t and off64_t are the same size, or when + _FILE_OFFSET_BITS=64. + 2016-08-18 Stefan Liebler * sysdeps/ieee754/dbl-64/k_rem_pio2.c (__kernel_rem_pio2): diff --git a/manual/examples/ofdlocks.c b/manual/examples/ofdlocks.c index ba4f0ef4d237..a6971235841b 100644 --- a/manual/examples/ofdlocks.c +++ b/manual/examples/ofdlocks.c @@ -15,6 +15,10 @@ along with this program; if not, see . */ +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 +#endif + #define _GNU_SOURCE #include #include diff --git a/manual/llio.texi b/manual/llio.texi index 019dea2c3189..5639a88e79a2 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..5a4aad0698b8 100644 --- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h +++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h @@ -127,11 +127,17 @@ 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 Linux does not support legacy (non-LFS) 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 __OFF_T_MATCHES_OFF64_T || defined __USE_FILE_OFFSET64 +# define F_OFD_GETLK 36 +# define F_OFD_SETLK 37 +# define F_OFD_SETLKW 38 +# endif #endif #ifdef __USE_LARGEFILE64