[Bug libc/20251] 32bit programs pass garbage in struct flock for OFD locks

cvs-commit at gcc dot gnu.org sourceware-bugzilla@sourceware.org
Tue Jun 26 17:22:00 GMT 2018


https://sourceware.org/bugzilla/show_bug.cgi?id=20251

--- Comment #9 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  06ab719d30b01da401150068054d3b8ea93dd12f (commit)
      from  124e025864bb39732c71fc60c1443d5680881a0a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=06ab719d30b01da401150068054d3b8ea93dd12f

commit 06ab719d30b01da401150068054d3b8ea93dd12f
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Wed Apr 4 11:24:15 2018 -0300

    Fix Linux fcntl OFD locks for non-LFS architectures (BZ#20251)

    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} 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.  So to actually
    use F_OFD_* with LFS support the source must be built with LFS support
    (_FILE_OFFSET_BITS=64).

    Also F_OFD_SETLKW command is handled a cancellation point, as for
    F_SETLKW{64}.

    Checked on x86_64-linux-gnu and i686-linux-gnu.

        [BZ #20251]
        * NEWS: Mention fcntl64 addition.
        * csu/check_fds.c: Replace __fcntl_nocancel by __fcntl64_nocancel.
        * login/utmp_file.c: Likewise.
        * sysdeps/posix/fdopendir.c: Likewise.
        * sysdeps/posix/opendir.c: Likewise.
        * sysdeps/unix/pt-fcntl.c: Likewise.
        * include/fcntl.h (__libc_fcntl64, __fcntl64,
        __fcntl64_nocancel_adjusted): New prototype.
        (__fcntl_nocancel_adjusted): Remove prototype.
        * io/Makefile (routines): Add fcntl64.
        (CFLAGS-fcntl64.c): New rule.
        * io/Versions [GLIBC_2.28] (fcntl64): New symbol.
        [GLIBC_PRIVATE] (__libc_fcntl): Rename to __libc_fcntl64.
        * io/fcntl.h (fcntl64): Add prototype and redirect if
        __USE_FILE_OFFSET64 is defined.
        * io/fcntl64.c: New file.
        * manual/llio.text: Add a note for which commands fcntl acts a
        cancellation point.
        * nptl/Makefile (CFLAGS-fcntl64.c): New rule.
        * sysdeps/mach/hurd/fcntl.c: Alias fcntl to fcntl64 symbols.
        * sysdeps/mach/hurd/i386/libc.abilist [GLIBC_2.28] (fcntl, 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.
        * sysdeps/unix/sysv/linux/fcntl64.c: New file.
        * sysdeps/unix/sysv/linux/fcntl_nocancel.c (__fcntl_nocancel): Rename
        to __fcntl64_nocancel.
        (__fcntl_nocancel_adjusted): Rename to __fcntl64_nocancel_adjusted.
        * sysdeps/unix/sysv/linux/not-cancel.h (__fcntl_nocancel): Rename
        to __fcntl64_nocancel.
        * sysdeps/unix/sysv/linux/tst-ofdlocks.c: New file.
        * sysdeps/unix/sysv/linux/tst-ofdlocks-compat.c: Likewise.
        * sysdeps/unix/sysv/linux/Makefile (tests): Add tst-ofdlocks.
        (tests-internal): Add tst-ofdlocks-compat.
        * sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.28]
        (fcntl64): New symbol.
        * 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/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise.
        * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.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/x86_64/64/libc.abilist: Likewise.
        * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
        * sysdeps/unix/sysv/linux/arm/libc.abilist [GLIBC_2.28] (fcntl,
        fcntl64): Likewise.
        * sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise.
        * sysdeps/unix/sysv/linux/i386/libc.abilis: 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/mips/mips64/n32/libc.abilist: Likewise.
        * sysdeps/unix/sysv/linux/nios2/libc.abilist: 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/sparc/sparc32/libc.abilist: Likewise.

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   68 +++++++++++++++
 NEWS                                               |    6 ++
 csu/check_fds.c                                    |    2 +-
 include/fcntl.h                                    |    7 ++-
 io/Makefile                                        |    3 +-
 io/Versions                                        |    5 +-
 io/fcntl.h                                         |   11 +++
 io/fcntl64.c                                       |   38 ++++++++
 login/utmp_file.c                                  |    4 +-
 manual/llio.texi                                   |   13 ++--
 nptl/Makefile                                      |    1 +
 sysdeps/generic/not-cancel.h                       |    4 +-
 sysdeps/mach/hurd/bits/errno.h                     |    9 ++
 sysdeps/mach/hurd/fcntl.c                          |    5 +
 sysdeps/mach/hurd/i386/libc.abilist                |    2 +
 sysdeps/posix/fdopendir.c                          |    2 +-
 sysdeps/posix/opendir.c                            |    2 +-
 sysdeps/unix/pt-fcntl.c                            |    2 +-
 sysdeps/unix/sysv/linux/Makefile                   |    4 +-
 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                    |   90 +++++++++++++++++---
 sysdeps/unix/sysv/linux/fcntl64.c                  |   63 ++++++++++++++
 sysdeps/unix/sysv/linux/fcntl_nocancel.c           |    8 +-
 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/not-cancel.h               |    4 +-
 .../sysv/linux/powerpc/powerpc32/fpu/libc.abilist  |    2 +
 .../linux/powerpc/powerpc32/nofpu/libc.abilist     |    2 +
 .../sysv/linux/powerpc/powerpc64/libc-le.abilist   |    1 +
 .../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/tst-ofdlocks-compat.c      |   84 ++++++++++++++++++
 sysdeps/unix/sysv/linux/tst-ofdlocks.c             |   76 +++++++++++++++++
 sysdeps/unix/sysv/linux/x86_64/64/libc.abilist     |    1 +
 sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist    |    1 +
 51 files changed, 519 insertions(+), 35 deletions(-)
 create mode 100644 io/fcntl64.c
 create mode 100644 sysdeps/unix/sysv/linux/fcntl64.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-ofdlocks-compat.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-ofdlocks.c

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the Glibc-bugs mailing list