diff options
Diffstat (limited to '0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch')
-rw-r--r-- | 0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch b/0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch new file mode 100644 index 0000000..a63fefc --- /dev/null +++ b/0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch @@ -0,0 +1,68 @@ +From 0301637b9931766ee389aedf3899cde756b37283 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" <hjl.tools@gmail.com> +Date: Wed, 24 Jul 2024 14:05:13 -0700 +Subject: [PATCH 08/12] linux: Update the mremap C implementation [BZ #31968] + +Update the mremap C implementation to support the optional argument for +MREMAP_DONTUNMAP added in Linux 5.7 since it may not always be correct +to implement a variadic function as a non-variadic function on all Linux +targets. Return MAP_FAILED and set errno to EINVAL for unknown flag bits. +This fixes BZ #31968. + +Note: A test must be added when a new flag bit is introduced. + +Signed-off-by: H.J. Lu <hjl.tools@gmail.com> +Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> +(cherry picked from commit 6c40cb0e9f893d49dc7caee580a055de53562206) +--- + NEWS | 1 + + sysdeps/unix/sysv/linux/mremap.c | 14 +++++++++++++- + 2 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/NEWS b/NEWS +index 3b252c96b4..5172049eb2 100644 +--- a/NEWS ++++ b/NEWS +@@ -55,6 +55,7 @@ The following bugs are resolved with this release: + [31476] resolv: Track single-request fallback via _res._flags + [31890] resolv: Allow short error responses to match any DNS query + [31965] rseq extension mechanism does not work as intended ++ [31968] mremap implementation in C does not handle arguments correctly + + + Version 2.38 +diff --git a/sysdeps/unix/sysv/linux/mremap.c b/sysdeps/unix/sysv/linux/mremap.c +index 0ad5da86a2..05ed8febfa 100644 +--- a/sysdeps/unix/sysv/linux/mremap.c ++++ b/sysdeps/unix/sysv/linux/mremap.c +@@ -20,6 +20,12 @@ + #include <sysdep.h> + #include <stdarg.h> + #include <stddef.h> ++#include <errno.h> ++ ++#define MREMAP_KNOWN_BITS \ ++ (MREMAP_MAYMOVE \ ++ | MREMAP_FIXED \ ++ | MREMAP_DONTUNMAP) + + void * + __mremap (void *addr, size_t old_len, size_t new_len, int flags, ...) +@@ -27,7 +33,13 @@ __mremap (void *addr, size_t old_len, size_t new_len, int flags, ...) + va_list va; + void *new_addr = NULL; + +- if (flags & MREMAP_FIXED) ++ if (flags & ~(MREMAP_KNOWN_BITS)) ++ { ++ __set_errno (EINVAL); ++ return MAP_FAILED; ++ } ++ ++ if (flags & (MREMAP_FIXED | MREMAP_DONTUNMAP)) + { + va_start (va, flags); + new_addr = va_arg (va, void *); +-- +2.33.0 + |