glibc/0008-linux-Update-the-mremap-C-implementation-BZ-31968.patch
liqingqing_1229 8ead2a5406 sync from glibc upstream 2.38 branch.
here are the patches:
9184c13681 resolv: Fix tst-resolv-short-response for older GCC (bug 32042)
3ac7ba61d2 Update syscall lists for Linux 6.5
6bb75212e6 Add mremap tests
f0e2114535 mremap: Update manual entry
0301637b99 linux: Update the mremap C implementation [BZ #31968]
1bed6acf50 resolv: Track single-request fallback via _res._flags (bug 31476)
6cad0f543c resolv: Do not wait for non-existing second DNS response after error (bug 30081)
dc512364e8 resolv: Allow short error responses to match any query (bug 31890)
bb30bd2162 Linux: Make __rseq_size useful for feature detection (bug 31965)
d9d019d674 elf: Make dl-rseq-symbols Linux only
7bfc35959d nptl: fix potential merge of __rseq_* relro symbols
712453634c s390x: Fix segfault in wcsncmp [BZ #31934]

(cherry picked from commit bfffcbf6ae59fd90403d1a40103b2a61ba4aaf6b)
2024-08-06 19:37:39 +08:00

69 lines
2.2 KiB
Diff
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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