diff options
author | Roland McGrath <roland@gnu.org> | 2002-11-09 00:36:21 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-11-09 00:36:21 +0000 |
commit | 9372c9582451c4d40152769a0aeba35e58942b59 (patch) | |
tree | 1432bae1710df677dde7bdc95bb8057fbd6b3449 /sysdeps/unix/sysv/linux/mmap64.c | |
parent | 2b49744308c65a95862b4ae197f27cec3ae8beaa (diff) | |
download | glibc-9372c9582451c4d40152769a0aeba35e58942b59.tar.gz glibc-9372c9582451c4d40152769a0aeba35e58942b59.tar.xz glibc-9372c9582451c4d40152769a0aeba35e58942b59.zip |
* string/test-strspn.c (do_test): Ensure zero termination.
* string/test-strpbrk.c (do_test): Likewise. * string/test-strncmp.c (stupid_strncmp): Use strnlen, not strlen. * string/test-strncpy.c (stupid_strncpy): Likewise. * string/test-stpncpy.c (stupid_stpncpy): Likewise. 2002-10-08 Roland McGrath <roland@redhat.com> * string/test-string.h (test_init): Fill BUF1 and BUF2 with nonzero characters. 2002-09-22 H.J. Lu <hjl@gnu.org> * sysdeps/unix/sysv/linux/mmap64.c (MMAP2_PAGE_SHIFT): Renamed from PAGE_SHIFT. Define if not defined. Check MMAP2_PAGE_SHIFT only if __NR_mmap2 is defined. * sysdeps/unix/sysv/linux/powerpc/mmap64.c: Moved to ... * sysdeps/unix/sysv/linux/mmap64.c: ... here. * sysdeps/unix/sysv/linux/hppa/mmap64.c: File removed. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: FIle removed,
Diffstat (limited to 'sysdeps/unix/sysv/linux/mmap64.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/mmap64.c | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/sysdeps/unix/sysv/linux/mmap64.c b/sysdeps/unix/sysv/linux/mmap64.c index 7d75a241c7..ea7cd3233e 100644 --- a/sysdeps/unix/sysv/linux/mmap64.c +++ b/sysdeps/unix/sysv/linux/mmap64.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1999,2000,01,02 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Daniel Jacobowitz <dan@debian.org>, 1999. + Contributed by Jakub Jelinek <jakub@redhat.com>, 1999. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,21 +19,67 @@ #include <errno.h> #include <unistd.h> +#include <sys/mman.h> #include <sysdep.h> #include <sys/syscall.h> +#include <bp-checks.h> -#include <sys/mman.h> +#include "kernel-features.h" + +#ifdef __NR_mmap2 +/* We have the system call that takes page number instead of byte address. */ +extern void *__unbounded __syscall_mmap2 (void *__unbounded, size_t, + int, int, int, off_t); + +/* This is always 12, even on architectures where PAGE_SHIFT != 12. */ +# ifndef MMAP2_PAGE_SHIFT +# define MMAP2_PAGE_SHIFT 12 +# endif -__ptr_t -__mmap64 (addr, len, prot, flags, fd, offset) - __ptr_t addr; - size_t len; - int prot; - int flags; - int fd; - off64_t offset; +# ifndef __ASSUME_MMAP2_SYSCALL +static int have_no_mmap2; +# endif +#endif + + +void * +__mmap64 (void *addr, size_t len, int prot, int flags, int fd, off64_t offset) { +#ifdef __NR_mmap2 + if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1)) + { + __set_errno (EINVAL); + return MAP_FAILED; + } +# ifndef __ASSUME_MMAP2_SYSCALL + if (! have_no_mmap2) +# endif + { +# ifndef __ASSUME_MMAP2_SYSCALL + int saved_errno = errno; +# endif + void *result; + __ptrvalue (result) = (void *__unbounded) + INLINE_SYSCALL (mmap2, 6, __ptrvalue (addr), + len, prot, flags, fd, + (off_t) (offset >> MMAP2_PAGE_SHIFT)); +# if __BOUNDED_POINTERS__ + __ptrlow (result) = __ptrvalue (result); + __ptrhigh (result) = __ptrvalue (result) + len; +# endif +# ifndef __ASSUME_MMAP2_SYSCALL + if (result != MAP_FAILED || errno != ENOSYS) +# endif + return result; + +# ifndef __ASSUME_MMAP2_SYSCALL + __set_errno (saved_errno); + have_no_mmap2 = 1; +# endif + } +#endif +#ifndef __ASSUME_MMAP2_SYSCALL if (offset != (off_t) offset || (offset + len) != (off_t) (offset + len)) { __set_errno (EINVAL); @@ -41,6 +87,6 @@ __mmap64 (addr, len, prot, flags, fd, offset) } return __mmap (addr, len, prot, flags, fd, (off_t) offset); +#endif } - weak_alias (__mmap64, mmap64) |