From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 70524 invoked by alias); 25 May 2018 20:03:48 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 70491 invoked by uid 89); 25 May 2018 20:03:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=tile, sk:INTERNA, redirect, 1933 X-HELO: mail-qk0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=YUItuLIEepZQ5Z+BA/yX7rdrhN20cRXPMwwsVZ5/fCo=; b=bHfm+Gx7ky7fVuWa01KQWVH4cmbGojpQh5+DJ5XRSOCrLqnxIBDAfLNmdiFsK+PtqL mj74gtgSaxCulJaRCPLPZRR+QdnXPdM+AQ0vbXt/j8MoXeiWtg1wPpqQ9e3Oi2bL53pf 8cnQG4kg6hqqgZ0B/4vShGgQdTkD/1ITsaQogSTr99KiCnu8flhDUOaoKDCLeS491PRe jmpujpTQWiSfu/dTPcVBO6lm6AAmb094PpbtP6vMuC/eOPZEfs29rIDAhP0IU3lxe+2V U2ARo9t5Tjvo61KTY5KEqEqwz5WMY3GZvVCAkb3KYqYXPf1FU5nLycDVEhS39cpCwntb nZpw== X-Gm-Message-State: ALKqPwc79Z1a/64qZIC8ISbpuL6ZYWVU/xRYpTJH5YEgo8aDnn3fpN92 PKgDUtrdgRvWPFYXSdghmnwK54vDjNk= X-Google-Smtp-Source: ADUXVKL/VDOvBUQvu82JNYzMJbmUznHIwM9fDaUbVQDZFz8HyefWsR9FBu7/ZIRViU5oN5aUcLP9Zw== X-Received: by 2002:a37:4152:: with SMTP id o79-v6mr3312860qka.327.1527278620210; Fri, 25 May 2018 13:03:40 -0700 (PDT) Subject: Re: [PATCH] Fix Linux fcntl OFD locks for non-LFS architectures (BZ#20251) From: Adhemerval Zanella To: libc-alpha@sourceware.org References: <1522877210-27934-1-git-send-email-adhemerval.zanella@linaro.org> <8f7abb3b-a1a3-d5aa-368c-adadedcc02c2@linaro.org> <55193f9d-1163-2860-e036-19fd72507d60@linaro.org> Openpgp: preference=signencrypt Autocrypt: addr=adhemerval.zanella@linaro.org; prefer-encrypt=mutual; keydata= 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 Message-ID: <71dcc28c-b909-2cb8-7694-8208cc19e798@linaro.org> Date: Fri, 25 May 2018 20:03:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <55193f9d-1163-2860-e036-19fd72507d60@linaro.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-05/txt/msg00818.txt.bz2 Ping. On 21/05/2018 16:00, Adhemerval Zanella wrote: > Updated version, change from previous one: > > - Adjsut abilist with recent changes to remove the ABI tags. > - Do not export __fcntl64 (there is no need to mimic old behavior). > > --- > > This patch fixes the OFD ("file private") locks for architectures that > support non-LFS flock definition (__USE_FILE_OFFSET64 not defined). The > issue in this case is both F_OFD_{GETLK,SETLK,SETLKW} and > F_{SET,GET}L{W}K64 expects a flock64 argument and when using old F_OFD_* > flags with a non LFS flock argument the kernel might interpret the underlying > data wrongly. Kernel idea originally was to avoid using such flags in > non-LFS syscall, but since GLIBC uses fcntl with LFS semantic as default > it is possible to provide the functionality and avoid the bogus struct kernel > passing by adjusting the struct manually for the required flags. > > The idea follows other LFS interfaces that provide two symbols: > > 1. A new LFS fcntl64 is added on default ABI with the usual macros to select > it for FILE_OFFSET_BITS=64. > > 2. The Linux non-LFS fcntl use a stack allocated struct flock64 for > F_OFD_{GETLK,SETLK,SETLKW} and F_{SET,GET}L{W}K64 and copy the results on > the user provided struct. > > 3. Keep a compat symbol with old broken semantic for architectures that do > not define __OFF_T_MATCHES_OFF64_T. > > So for architectures which defines __USE_FILE_OFFSET64, fcntl64 will aliased > to fcntl and no adjustment would be required. > > Checked on x86_64-linux-gnu and i686-linux-gnu. > > [BZ #20251] > * include/fcntl.h (__libc_fcntl64, __fcntl64): New prototype. > * io/Makefile (routines): Add fcntl64. > (CFLAGS-fcntl64.c): New rule. > * io/fcntl.h (fcntl64): Add prototype and redirect if > __USE_FILE_OFFSET64 is defined. > * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Remove file. > * io/fcntl64.c: New file. > * nptl/Makefile (pthread-compat-wrappers): Add fcntl64. > (CFLAGS-fcntl64.c): New rule. > * sysdeps/mach/hurd/fcntl.c: Alias fcntl to fcntl64 symbols. > * io/Versions [GLIBC_2.28] (fcntl64; __fcntl64): New symbols. > * sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Fix F_GETLK64, > F_OFD_GETLK, F_SETLK64, F_SETLKW64, F_OFD_SETLK, and F_OFD_SETLKW for > non-LFS case. > (fcntl_common, __fcntl_nocancel): Remove function. > (flock_to_flock64): New function. > * sysdeps/unix/sysv/linux/fcntl64.c: New file. > * sysdeps/mach/hurd/i386/libc.abilist [GLIBC_2.28] (__fcntl64, fcntl, > fcntl64): New symbols. > * sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/arm/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/i386/libc.abilis: Likewise. > * sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/powerpc/kernel-features.h: Likewise. > * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist: > Likewise. > * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist: > Likewise. > * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.28] (__fcntl64, > fcntl64): New symbols. > * sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise. > * sysdeps/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise. > * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/tile/tilegx32/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/tile/tilegx64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise. > * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise. > --- > ChangeLog | 54 ++++++++++ > include/fcntl.h | 4 + > io/Makefile | 3 +- > io/Versions | 3 + > io/fcntl.h | 11 ++ > .../powerpc/powerpc64/fcntl.c => io/fcntl64.c | 28 ++++-- > nptl/Makefile | 3 +- > sysdeps/mach/hurd/fcntl.c | 5 + > sysdeps/mach/hurd/i386/libc.abilist | 2 + > sysdeps/unix/sysv/linux/aarch64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/alpha/libc.abilist | 1 + > sysdeps/unix/sysv/linux/arm/libc.abilist | 2 + > sysdeps/unix/sysv/linux/fcntl.c | 111 +++++++++++++-------- > sysdeps/unix/sysv/linux/fcntl64.c | 99 ++++++++++++++++++ > sysdeps/unix/sysv/linux/hppa/libc.abilist | 2 + > sysdeps/unix/sysv/linux/i386/libc.abilist | 2 + > sysdeps/unix/sysv/linux/ia64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist | 2 + > sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist | 2 + > sysdeps/unix/sysv/linux/microblaze/libc.abilist | 2 + > .../unix/sysv/linux/mips/mips32/fpu/libc.abilist | 2 + > .../unix/sysv/linux/mips/mips32/nofpu/libc.abilist | 2 + > .../unix/sysv/linux/mips/mips64/n32/libc.abilist | 2 + > .../unix/sysv/linux/mips/mips64/n64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/nios2/libc.abilist | 2 + > sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 9 ++ > .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist | 2 + > .../linux/powerpc/powerpc32/nofpu/libc.abilist | 2 + > .../sysv/linux/powerpc/powerpc64/libc-le.abilist | 3 + > .../unix/sysv/linux/powerpc/powerpc64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist | 2 + > sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/sh/libc.abilist | 2 + > sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist | 2 + > sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/x86_64/64/libc.abilist | 1 + > sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist | 1 + > 38 files changed, 323 insertions(+), 52 deletions(-) > rename sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c => io/fcntl64.c (65%) > create mode 100644 sysdeps/unix/sysv/linux/fcntl64.c > > > diff --git a/include/fcntl.h b/include/fcntl.h > index 3d68c5e..374e784 100644 > --- a/include/fcntl.h > +++ b/include/fcntl.h > @@ -10,10 +10,14 @@ extern int __libc_open (const char *file, int oflag, ...); > libc_hidden_proto (__libc_open) > extern int __libc_fcntl (int fd, int cmd, ...) attribute_hidden; > libc_hidden_proto (__libc_fcntl) > +extern int __libc_fcntl64 (int fd, int cmd, ...) attribute_hidden; > +libc_hidden_proto (__libc_fcntl64) > extern int __open (const char *__file, int __oflag, ...); > libc_hidden_proto (__open) > extern int __fcntl (int __fd, int __cmd, ...); > libc_hidden_proto (__fcntl) > +extern int __fcntl64 (int __fd, int __cmd, ...) attribute_hidden; > +libc_hidden_proto (__fcntl64) > extern int __openat (int __fd, const char *__file, int __oflag, ...) > __nonnull ((2)); > libc_hidden_proto (__openat) > diff --git a/io/Makefile b/io/Makefile > index 2117cb6..4a0d8fe 100644 > --- a/io/Makefile > +++ b/io/Makefile > @@ -40,7 +40,7 @@ routines := \ > mkdir mkdirat \ > open open_2 open64 open64_2 openat openat_2 openat64 openat64_2 \ > read write lseek lseek64 access euidaccess faccessat \ > - fcntl flock lockf lockf64 \ > + fcntl fcntl64 flock lockf lockf64 \ > close dup dup2 dup3 pipe pipe2 \ > creat creat64 \ > chdir fchdir \ > @@ -89,6 +89,7 @@ CFLAGS-open64.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-creat.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-creat64.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-fcntl.c += -fexceptions -fasynchronous-unwind-tables > +CFLAGS-fcntl64.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-poll.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-ppoll.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-lockf.c += -fexceptions > diff --git a/io/Versions b/io/Versions > index 98898cb..7653588 100644 > --- a/io/Versions > +++ b/io/Versions > @@ -128,4 +128,7 @@ libc { > GLIBC_2.27 { > copy_file_range; > } > + GLIBC_2.28 { > + fcntl64; > + } > } > diff --git a/io/fcntl.h b/io/fcntl.h > index 69a4394..3afc620 100644 > --- a/io/fcntl.h > +++ b/io/fcntl.h > @@ -167,7 +167,18 @@ typedef __pid_t pid_t; > > This function is a cancellation point and therefore not marked with > __THROW. */ > +#ifndef __USE_FILE_OFFSET64 > extern int fcntl (int __fd, int __cmd, ...); > +#else > +# ifdef __REDIRECT > +extern int __REDIRECT (fcntl, (int __fd, int __cmd, ...), fcntl64); > +# else > +# define fcntl fcntl64 > +# endif > +#endif > +#ifdef __USE_LARGEFILE64 > +extern int fcntl64 (int __fd, int __cmd, ...); > +#endif > > /* Open FILE and return a new file descriptor for it, or -1 on error. > OFLAG determines the type of access used. If O_CREAT or O_TMPFILE is set > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/io/fcntl64.c > similarity index 65% > rename from sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c > rename to io/fcntl64.c > index 48198c1..f4e6809 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c > +++ b/io/fcntl64.c > @@ -1,4 +1,5 @@ > -/* Copyright (C) 2000-2018 Free Software Foundation, Inc. > +/* Manipulate file descriptor. Stub LFS version. > + Copyright (C) 2018 Free Software Foundation, Inc. > This file is part of the GNU C Library. > > The GNU C Library is free software; you can redistribute it and/or > @@ -15,18 +16,23 @@ > License along with the GNU C Library; if not, see > . */ > > -#include > +#include > #include > > -static inline int > -fcntl_adjust_cmd (int cmd) > +/* Perform file control operations on FD. */ > +int > +__fcntl64 (int fd, int cmd, ...) > { > - if (cmd >= F_GETLK64 && cmd <= F_SETLKW64) > - cmd -= F_GETLK64 - F_GETLK; > - return cmd; > -} > + if (fd < 0) > + { > + __set_errno (EBADF); > + return -1; > + } > > -#define FCNTL_ADJUST_CMD(__cmd) \ > - fcntl_adjust_cmd (__cmd) > + __set_errno (ENOSYS); > + return -1; > +} > +libc_hidden_def (__fcntl64) > +stub_warning (fcntl64) > > -#include > +weak_alias (__fcntl64, fcntl64) > diff --git a/nptl/Makefile b/nptl/Makefile > index 94be92c..13d485c 100644 > --- a/nptl/Makefile > +++ b/nptl/Makefile > @@ -36,7 +36,7 @@ static-only-routines = pthread_atfork > # We need to provide certain routines for compatibility with existing > # binaries. > pthread-compat-wrappers = \ > - write read close fcntl accept \ > + write read close fcntl fcntl64 accept \ > connect recv recvfrom send \ > sendto fsync lseek lseek64 \ > msync nanosleep open open64 pause \ > @@ -191,6 +191,7 @@ CFLAGS-sem_timedwait.c += -fexceptions -fasynchronous-unwind-tables > > # These are the function wrappers we have to duplicate here. > CFLAGS-fcntl.c += -fexceptions -fasynchronous-unwind-tables > +CFLAGS-fcntl64.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-lockf.c += -fexceptions > CFLAGS-pread.c += -fexceptions -fasynchronous-unwind-tables > CFLAGS-pread64.c += -fexceptions -fasynchronous-unwind-tables > diff --git a/sysdeps/mach/hurd/fcntl.c b/sysdeps/mach/hurd/fcntl.c > index 0b23164..598317d 100644 > --- a/sysdeps/mach/hurd/fcntl.c > +++ b/sysdeps/mach/hurd/fcntl.c > @@ -210,3 +210,8 @@ libc_hidden_def (__libc_fcntl) > weak_alias (__libc_fcntl, __fcntl) > libc_hidden_weak (__fcntl) > weak_alias (__libc_fcntl, fcntl) > + > +strong_alias (__libc_fcntl, __libc_fcntl64) > +libc_hidden_def (__libc_fcntl64) > +weak_alias (__libc_fcntl64, __fcntl64) > +libc_hidden_weak (__fcntl64) > diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist > index 2cb5070..3d46de7 100644 > --- a/sysdeps/mach/hurd/i386/libc.abilist > +++ b/sysdeps/mach/hurd/i386/libc.abilist > @@ -2033,6 +2033,8 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > index 80cdb98..884d0df 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > @@ -2131,3 +2131,4 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist > index c761f61..28d54b9 100644 > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist > @@ -2026,6 +2026,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist > index 6aa58c3..dfde3bd 100644 > --- a/sysdeps/unix/sysv/linux/arm/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist > @@ -115,6 +115,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 > GLIBC_2.4 _IO_2_1_stdin_ D 0xa0 > diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c > index a3cb2ae..ada922b 100644 > --- a/sysdeps/unix/sysv/linux/fcntl.c > +++ b/sysdeps/unix/sysv/linux/fcntl.c > @@ -19,33 +19,12 @@ > #include > #include > #include > -#include > > -#ifndef __NR_fcntl64 > -# define __NR_fcntl64 __NR_fcntl > -#endif > +#ifndef __OFF_T_MATCHES_OFF64_T > > -#ifndef FCNTL_ADJUST_CMD > -# define FCNTL_ADJUST_CMD(__cmd) __cmd > -#endif > - > -static int > -fcntl_common (int fd, int cmd, void *arg) > -{ > - if (cmd == F_GETOWN) > - { > - INTERNAL_SYSCALL_DECL (err); > - struct f_owner_ex fex; > - int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex); > - if (!INTERNAL_SYSCALL_ERROR_P (res, err)) > - return fex.type == F_OWNER_GID ? -fex.pid : fex.pid; > - > - return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res, > - err)); > - } > - > - return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg); > -} > +# ifndef FCNTL_ADJUST_CMD > +# define FCNTL_ADJUST_CMD(__cmd) __cmd > +# endif > > int > __libc_fcntl (int fd, int cmd, ...) > @@ -59,16 +38,71 @@ __libc_fcntl (int fd, int cmd, ...) > > cmd = FCNTL_ADJUST_CMD (cmd); > > - if (cmd == F_SETLKW || cmd == F_SETLKW64) > - return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg); > - > - return fcntl_common (fd, cmd, arg); > + switch (cmd) > + { > + case F_SETLKW: > + return SYSCALL_CANCEL (fcntl64, fd, cmd, arg); > + case F_GETLK64: > + case F_OFD_GETLK: > + { > + struct flock *flk = (struct flock *) arg; > + struct flock64 flk64 = > + { > + .l_type = flk->l_type, > + .l_whence = flk->l_whence, > + .l_start = flk->l_start, > + .l_len = flk->l_len, > + .l_pid = flk->l_pid > + }; > + int ret = SYSCALL_CANCEL (fcntl64, fd, cmd, &flk64); > + if (ret == -1) > + return -1; > + flk->l_type = flk64.l_type; > + flk->l_whence = flk64.l_whence; > + flk->l_start = flk64.l_start; > + flk->l_len = flk64.l_len; > + flk->l_pid = flk64.l_pid; > + return ret; > + } > + case F_SETLK64: > + case F_SETLKW64: > + case F_OFD_SETLK: > + case F_OFD_SETLKW: > + { > + struct flock *flk = (struct flock *) arg; > + struct flock64 flk64 = > + { > + .l_type = flk->l_type, > + .l_whence = flk->l_whence, > + .l_start = flk->l_start, > + .l_len = flk->l_len, > + .l_pid = flk->l_pid > + }; > + return SYSCALL_CANCEL (fcntl64, fd, cmd, &flk64); > + } > + case F_GETOWN: > + { > + INTERNAL_SYSCALL_DECL (err); > + struct f_owner_ex fex; > + int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex); > + if (!INTERNAL_SYSCALL_ERROR_P (res, err)) > + return fex.type == F_OWNER_GID ? -fex.pid : fex.pid; > + > + return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res, > + err)); > + } > + default: > + return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, arg); > + } > } > libc_hidden_def (__libc_fcntl) > +weak_alias (__libc_fcntl, __fcntl) > +libc_hidden_weak (__fcntl) > > -#if !IS_IN (rtld) > +# include > +# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_28) > int > -__fcntl_nocancel (int fd, int cmd, ...) > +__old_libc_fcntl64 (int fd, int cmd, ...) > { > va_list ap; > void *arg; > @@ -77,13 +111,12 @@ __fcntl_nocancel (int fd, int cmd, ...) > arg = va_arg (ap, void *); > va_end (ap); > > - return fcntl_common (fd, cmd, arg); > + return __libc_fcntl64 (fd, cmd, arg); > } > -#else > -strong_alias (__libc_fcntl, __fcntl_nocancel) > -#endif > -libc_hidden_def (__fcntl_nocancel) > - > -weak_alias (__libc_fcntl, __fcntl) > -libc_hidden_weak (__fcntl) > +compat_symbol (libc, __old_libc_fcntl64, fcntl, GLIBC_2_0); > +versioned_symbol (libc, __libc_fcntl, fcntl, GLIBC_2_28); > +# else > weak_alias (__libc_fcntl, fcntl) > +# endif > + > +#endif /* __OFF_T_MATCHES_OFF64_T */ > diff --git a/sysdeps/unix/sysv/linux/fcntl64.c b/sysdeps/unix/sysv/linux/fcntl64.c > new file mode 100644 > index 0000000..b7f50b0 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/fcntl64.c > @@ -0,0 +1,99 @@ > +/* Manipulate file descriptor. Linux LFS version. > + Copyright (C) 2018 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#define fcntl __no_decl_fcntl > +#define __fcntl __no_decl___fcntl > +#include > +#undef fcntl > +#undef __fcntl > +#include > +#include > +#include > + > +#ifndef __NR_fcntl64 > +# define __NR_fcntl64 __NR_fcntl > +#endif > + > +#ifndef FCNTL_ADJUST_CMD > +# define FCNTL_ADJUST_CMD(__cmd) __cmd > +#endif > + > +static int > +fcntl64_common (int fd, int cmd, void *arg) > +{ > + if (cmd == F_GETOWN) > + { > + INTERNAL_SYSCALL_DECL (err); > + struct f_owner_ex fex; > + int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex); > + if (!INTERNAL_SYSCALL_ERROR_P (res, err)) > + return fex.type == F_OWNER_GID ? -fex.pid : fex.pid; > + > + return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res, > + err)); > + } > + > + return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg); > +} > + > +int > +__libc_fcntl64 (int fd, int cmd, ...) > +{ > + va_list ap; > + void *arg; > + > + va_start (ap, cmd); > + arg = va_arg (ap, void *); > + va_end (ap); > + > + cmd = FCNTL_ADJUST_CMD (cmd); > + > + if (cmd == F_SETLKW || cmd == F_SETLKW64) > + return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg); > + > + return fcntl64_common (fd, cmd, arg); > +} > +libc_hidden_def (__libc_fcntl64) > +weak_alias (__libc_fcntl64, __fcntl64) > +libc_hidden_weak (__fcntl64) > +weak_alias (__libc_fcntl64, fcntl64) > + > +#ifdef __OFF_T_MATCHES_OFF64_T > +weak_alias (__libc_fcntl64, __libc_fcntl) > +weak_alias (__libc_fcntl64, __fcntl) > +weak_alias (__libc_fcntl64, __GI___fcntl) > +weak_alias (__libc_fcntl64, fcntl) > +#endif > + > +#if !IS_IN (rtld) > +int > +__fcntl_nocancel (int fd, int cmd, ...) > +{ > + va_list ap; > + void *arg; > + > + va_start (ap, cmd); > + arg = va_arg (ap, void *); > + va_end (ap); > + > + return fcntl64_common (fd, cmd, arg); > +} > +#else > +weak_alias (__libc_fcntl64, __fcntl_nocancel) > +#endif > +weak_alias (__fcntl_nocancel, __GI___fcntl_nocancel) > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist > index d10695b..06b00f7 100644 > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist > @@ -1872,6 +1872,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist > index 23092ab..1c1cc00 100644 > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist > @@ -2037,6 +2037,8 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist > index 7bf259e..f6e17a0 100644 > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist > @@ -1907,6 +1907,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > index 4673bcd..ee054a6 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > @@ -116,6 +116,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0x98 > GLIBC_2.4 _IO_2_1_stdin_ D 0x98 > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > index 1f8ac40..227a058 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > @@ -1981,6 +1981,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > index 09277f5..18781b3 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > @@ -2122,3 +2122,5 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > index f562e20..2d86989 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > @@ -1959,6 +1959,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > index ceb7388..b8b113e 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > @@ -1957,6 +1957,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > index 5765f48..6a3cd13 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > @@ -1965,6 +1965,8 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > index a84bb45..596ec05 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > @@ -1961,6 +1961,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist > index e432959..8da18ee 100644 > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist > @@ -2163,3 +2163,5 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > index 503f562..dd8a7ea 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > @@ -52,3 +52,12 @@ > > #undef __ASSUME_CLONE_DEFAULT > #define __ASSUME_CLONE_BACKWARDS 1 > + > +#ifdef __powerpc64__ > +# define FCNTL_ADJUST_CMD(__cmd) \ > + ({ int __cmdadj = (__cmd); \ > + if (__cmdadj >= F_GETLK64 && __cmdadj <= F_SETLKW64) \ > + __cmdadj -= F_GETLK64 - F_GETLK; \ > + __cmdadj; \ > + }) > +#endif > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > index a5f2b23..555751e 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > @@ -1985,6 +1985,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > index e4cbe36..80324e4 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > @@ -1989,6 +1989,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > index 9869feb..079bbb4 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist > @@ -2221,3 +2221,6 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 GLIBC_2.28 A > +GLIBC_2.28 __fcntl64 F > +GLIBC_2.28 fcntl64 F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > index e526dc4..15be314 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist > @@ -116,6 +116,7 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 _Exit F > GLIBC_2.3 _IO_2_1_stderr_ D 0xe0 > GLIBC_2.3 _IO_2_1_stdin_ D 0xe0 > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > index e6319ee..436b992 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > @@ -2093,3 +2093,4 @@ GLIBC_2.27 xdrstdio_create F > GLIBC_2.27 xencrypt F > GLIBC_2.27 xprt_register F > GLIBC_2.27 xprt_unregister F > +GLIBC_2.28 fcntl64 F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > index 41cdda0..f66715f 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > @@ -1994,6 +1994,8 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > index 8a756cf..bd62428 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > @@ -1900,6 +1900,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist > index 999bddd..f2f070f 100644 > --- a/sysdeps/unix/sysv/linux/sh/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist > @@ -1876,6 +1876,8 @@ GLIBC_2.27 wcstof32x F > GLIBC_2.27 wcstof32x_l F > GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > index 7c4296f..265087f 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > @@ -1988,6 +1988,8 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > index dafe9d7..16a6981 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > @@ -1930,6 +1930,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > index f72d494..fa8c198 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > @@ -1888,6 +1888,7 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F > GLIBC_2.3 __ctype_b_loc F > GLIBC_2.3 __ctype_tolower_loc F > GLIBC_2.3 __ctype_toupper_loc F > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > index 96c9fa0..2536971 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > @@ -2139,3 +2139,4 @@ GLIBC_2.27 wcstof64 F > GLIBC_2.27 wcstof64_l F > GLIBC_2.27 wcstof64x F > GLIBC_2.27 wcstof64x_l F > +GLIBC_2.28 fcntl64 F >