]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix MIPS mmap negative offset handling for consistency (bug 19550).
authorJoseph Myers <joseph@codesourcery.com>
Mon, 1 Feb 2016 18:20:21 +0000 (18:20 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Mon, 1 Feb 2016 18:20:21 +0000 (18:20 +0000)
The handling of negative offsets in MIPS mmap is inconsistent with
other architectures, as shown by failure of the test
posix/tst-mmap-offset for o32 and n32.  The MIPS mmap syscall uses a
signed argument and does a signed arithmetic shift on it, whereas the
glibc semantics expected by that test are for the offset to be
considered as a large positive offset.  This patch makes MIPS
consistent with other architectures as far as possible by using the
mmap2 syscall on o32 (#including the generic implementation), and
making mmap not an alias for mmap64 for n32, with a custom
implementation for n32 that zero-extends the offset argument to 64-bit
before calling the mmap syscall.

Tested for MIPS64 (o32, n32, n64).

[BZ #19550]
* sysdeps/unix/sysv/linux/mips/mips32/mmap.c: New file.
* sysdeps/unix/sysv/linux/mips/mips64/mmap64.c: Move to ....
* sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c: ... here.
* sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c: New file.
* sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list (mmap64):
New syscall entry.
* sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (mmap):
New syscall entry.
* sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (mmap): Remove
syscall entry.

ChangeLog
sysdeps/unix/sysv/linux/mips/mips32/mmap.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list
sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c [moved from sysdeps/unix/sysv/linux/mips/mips64/mmap64.c with 100% similarity]
sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list
sysdeps/unix/sysv/linux/mips/mips64/syscalls.list

index a0fd225cc6b86c7a28b43370d669164e9c5eee0d..b1e619148e210949c9dd925f7e9306626da15093 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2016-02-01  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #19550]
+       * sysdeps/unix/sysv/linux/mips/mips32/mmap.c: New file.
+       * sysdeps/unix/sysv/linux/mips/mips64/mmap64.c: Move to ....
+       * sysdeps/unix/sysv/linux/mips/mips64/n64/mmap64.c: ... here.
+       * sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c: New file.
+       * sysdeps/unix/sysv/linux/mips/mips64/n32/syscalls.list (mmap64):
+       New syscall entry.
+       * sysdeps/unix/sysv/linux/mips/mips64/n64/syscalls.list (mmap):
+       New syscall entry.
+       * sysdeps/unix/sysv/linux/mips/mips64/syscalls.list (mmap): Remove
+       syscall entry.
+
 2016-01-27  Paul Eggert  <eggert@cs.ucla.edu>
 
        [BZ #18240]
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mmap.c b/sysdeps/unix/sysv/linux/mips/mips32/mmap.c
new file mode 100644 (file)
index 0000000..f30b1da
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/generic/wordsize-32/mmap.c>
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/mmap.c
new file mode 100644 (file)
index 0000000..7afe776
--- /dev/null
@@ -0,0 +1,35 @@
+/* mmap for MIPS n32.
+   Copyright (C) 2016 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <errno.h>
+#include <stdint.h>
+#include <sysdep.h>
+
+__ptr_t
+__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
+{
+  /* To handle negative offsets consistently with other architectures,
+     the offset must be zero-extended to 64-bit.  */
+  uint64_t offset_adj = (uint64_t) (uint32_t) offset;
+  return (__ptr_t) INLINE_SYSCALL (mmap, 6, addr, len, prot, flags, fd,
+                                  offset_adj);
+}
+
+weak_alias (__mmap, mmap)
index 584ad1fcba3abe38914dc25d34c758bee9230e30..f55a94ac892e46e38ccd02930021409ade728fc8 100644 (file)
@@ -1,5 +1,7 @@
 # File name    Caller  Syscall name    # args  Strong name     Weak names
 
+mmap64         -       mmap            b:aniiii __mmap64       mmap64
+
 readahead      -       readahead       i:iii   __readahead     readahead
 sync_file_range        -       sync_file_range Ci:iiii sync_file_range
 
index b23a2a1d1cc3398d26bacbbd37b8c89d00a93c96..890a74494ae26eb5e396fafe88126eaa45c0c121 100644 (file)
@@ -1,5 +1,7 @@
 # File name    Caller  Syscall name    # args  Strong name     Weak names
 
+mmap           -       mmap            b:aniiii __mmap         mmap __mmap64 mmap64
+
 sync_file_range        -       sync_file_range Ci:iiii sync_file_range
 
 prlimit                EXTRA   prlimit64       i:iipp  prlimit         prlimit64
index 6c80e27f75b6b72ed32c7b22539f5681d3bc4646..66cc687abb05621a1c008fa20a4ae68735da0e70 100644 (file)
@@ -2,8 +2,6 @@
 
 lseek          -       lseek           i:iii   __libc_lseek    __lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64
 
-mmap           -       mmap            b:aniiii __mmap         mmap __mmap64 mmap64
-
 ftruncate      -       ftruncate       i:ii    __ftruncate     ftruncate ftruncate64 __ftruncate64
 truncate       -       truncate        i:si    truncate        truncate64