This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libc/19408] linux personality syscall wrapper may erroneously return an error on 32-bit architectures


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

--- Comment #1 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  e0043e17dfc52fe1702746543127cb4a87232bcd (commit)
      from  cc42170ef6ca931c7527a86f14fc66059b6dfff4 (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=e0043e17dfc52fe1702746543127cb4a87232bcd

commit e0043e17dfc52fe1702746543127cb4a87232bcd
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Sun Dec 27 16:30:02 2015 +0000

    Fix linux personality syscall wrapper

    The personality system call, starting with linux kernel commit
    v2.6.29-6609-g11d06b2a1e5658f448a308aa3beb97bacd64a940, always
    successfully changes the personality if requested.  The syscall
    wrapper, however, still can return an error in the following cases:
    - the value returned by the system call looks like an error
    due to architecture limitations of 32-bit kernels;
    - a personality greater than 0xffffffff is passed to the system call,
    and the 64-bit kernel does not have commit
    v2.6.35-rc1-372-g485d527686850d68a0e9006dd9904f19f122485e
    that would truncate this value to unsigned int;
    - on sparc64, the value returned by the system call looks like an error
    due to sparc64 kernel sign extension bug.

    The solution is three-fold:
    - move generic syscalls.list personality entry to generic 64-bit
    syscalls.list file;
    - for each 32-bit architecture that use negated errno semantics,
    add a NOERRNO personality entry to their syscalls.list file;
    - for sparc64 and 32-bit architectures that use dedicated registers
    to flag syscall errors, add a wrapper around personality syscall;
    if the system call return value is flagged as an error, this wrapper
    returns the negated "would be errno" value, otherwise it returns
    the system call return value; on sparc64, it also truncates the
    personality argument to unsigned int before passing it to the kernel.

    [BZ #19408]
    * sysdeps/unix/sysv/linux/personality.c: New file.
    * sysdeps/unix/sysv/linux/sparc/sparc64/personality.c: Likewise.
    * sysdeps/unix/sysv/linux/tst-personality.c: Likewise.
    * sysdeps/unix/sysv/linux/Makefile [$(subdir) == misc]
    (sysdep_routines): Add personality.
    (tests): Add tst-personality.
    * sysdeps/unix/sysv/linux/syscalls.list (personality): Move ...
    * sysdeps/unix/sysv/linux/wordsize-64/syscalls.list: ... here.
    * sysdeps/unix/sysv/linux/arm/syscalls.list (personality): New entry.
    * sysdeps/unix/sysv/linux/hppa/syscalls.list (personality): Likewise.
    * sysdeps/unix/sysv/linux/i386/syscalls.list (personality): Likewise.
    * sysdeps/unix/sysv/linux/m68k/syscalls.list (personality): Likewise.
    * sysdeps/unix/sysv/linux/microblaze/syscalls.list (personality):
    Likewise.
    * sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list (personality):
    Likewise.
    * sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list (personality):
    Likewise.
    * sysdeps/unix/sysv/linux/sh/syscalls.list (personality): Likewise.
    * sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list (personality):
    Likewise.

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

Summary of changes:
 ChangeLog                                          |   25 ++++++++++
 sysdeps/unix/sysv/linux/Makefile                   |    5 +-
 sysdeps/unix/sysv/linux/arm/syscalls.list          |    2 +
 sysdeps/unix/sysv/linux/hppa/syscalls.list         |    1 +
 sysdeps/unix/sysv/linux/i386/syscalls.list         |    2 +
 sysdeps/unix/sysv/linux/m68k/syscalls.list         |    1 +
 sysdeps/unix/sysv/linux/microblaze/syscalls.list   |    1 +
 .../unix/sysv/linux/mips/mips64/n32/syscalls.list  |    2 +
 sysdeps/unix/sysv/linux/personality.c              |   49 ++++++++++++++++++++
 sysdeps/unix/sysv/linux/s390/s390-32/syscalls.list |    1 +
 sysdeps/unix/sysv/linux/sh/syscalls.list           |    2 +
 .../unix/sysv/linux/sparc/sparc64/personality.c    |    3 +
 sysdeps/unix/sysv/linux/syscalls.list              |    1 -
 sysdeps/unix/sysv/linux/tst-personality.c          |   45 ++++++++++++++++++
 sysdeps/unix/sysv/linux/wordsize-64/syscalls.list  |    1 +
 sysdeps/unix/sysv/linux/x86_64/x32/syscalls.list   |    1 +
 16 files changed, 139 insertions(+), 3 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/personality.c
 create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/personality.c
 create mode 100644 sysdeps/unix/sysv/linux/tst-personality.c

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]