]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
linux: Implement mremap in C
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 17 Jun 2020 12:29:07 +0000 (09:29 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 30 Nov 2021 16:13:03 +0000 (13:13 -0300)
Variadic function calls in syscalls.list does not work for all ABIs
(for instance where the argument are passed on the stack instead of
registers) and might have underlying issues depending of the variadic
type (for instance if a 64-bit argument is used).

Checked on x86_64-linux-gnu.

sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/mremap.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/syscalls.list

index e8574f3c6fda48deb6d7c2632b9bc915c158a0af..29c6c78f989eba7ac6ed593a9d29570cc741ab7d 100644 (file)
@@ -68,6 +68,7 @@ sysdep_routines += adjtimex clone umount umount2 readahead sysctl \
                   closefrom_fallback \
                   clone3 clone-internal \
                   fanotify_mark \
+                  mremap \
 
 CFLAGS-gethostid.c = -fexceptions
 CFLAGS-tee.c = -fexceptions -fasynchronous-unwind-tables
diff --git a/sysdeps/unix/sysv/linux/mremap.c b/sysdeps/unix/sysv/linux/mremap.c
new file mode 100644 (file)
index 0000000..32e95db
--- /dev/null
@@ -0,0 +1,41 @@
+/* Remap a virtual memory address.  Linux specific syscall.
+   Copyright (C) 2021 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sys/mman.h>
+#include <sysdep.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+void *
+__mremap (void *addr, size_t old_len, size_t new_len, int flags, ...)
+{
+  va_list va;
+  void *new_addr = NULL;
+
+  if (flags & MREMAP_FIXED)
+    {
+      va_start (va, flags);
+      new_addr = va_arg (va, void *);
+      va_end (va);
+    }
+
+  return (void *) INLINE_SYSCALL_CALL (mremap, addr, old_len, new_len, flags,
+                                      new_addr);
+}
+libc_hidden_def (__mremap)
+weak_alias (__mremap, mremap)
index c38dbb34a1c104fb9da940391984f5b6ddb3635e..e7d7b025fc689ece1b3c422b4b4ce7944bc80b24 100644 (file)
@@ -35,7 +35,6 @@ mincore               -       mincore         i:aUV   mincore
 mlock          -       mlock           i:bU    mlock
 mlockall       -       mlockall        i:i     mlockall
 mount          EXTRA   mount           i:sssUp __mount mount
-mremap         EXTRA   mremap          b:aUUip __mremap        mremap
 munlock                -       munlock         i:aU    munlock
 munlockall     -       munlockall      i:      munlockall
 nfsservctl     EXTRA   nfsservctl      i:ipp   __compat_nfsservctl     nfsservctl@GLIBC_2.0:GLIBC_2.28