aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Karcher <Michael.Karcher@fu-berlin.de>2024-07-28 15:30:57 +0200
committerAndreas K. Hüttel <dilfridge@gentoo.org>2024-07-29 23:00:39 +0200
commitfaeaa3bc9f76030b9882ccfdee232fc0ca6dcb06 (patch)
tree8a57f4fb28d26893b20aa6ae31dea95006a69983
parentaedbf08891069fc029ed021e4dba933eb877b394 (diff)
downloadglibc-faeaa3bc9f76030b9882ccfdee232fc0ca6dcb06.zip
glibc-faeaa3bc9f76030b9882ccfdee232fc0ca6dcb06.tar.gz
glibc-faeaa3bc9f76030b9882ccfdee232fc0ca6dcb06.tar.bz2
Mitigation for "clone on sparc might fail with -EFAULT for no valid reason" (bz 31394)
It seems the kernel can not deal with uncommitted stack space in the area intended for the register window when executing the clone() system call. So create a nested frame (proxy for the kernel frame) and flush it from the processor to memory to force committing pages to the stack before invoking the system call. Bug: https://www.mail-archive.com/debian-glibc@lists.debian.org/msg62592.html Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31394 See-also: https://lore.kernel.org/sparclinux/62f9be9d-a086-4134-9a9f-5df8822708af@mkarcher.dialup.fu-berlin.de/ Signed-off-by: Michael Karcher <sourceware-bugzilla@mkarcher.dialup.fu-berlin.de> Reviewed-by: DJ Delorie <dj@redhat.com>
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/clone.S3
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/clone.S3
2 files changed, 6 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
index 748d25f..c9cf9bb 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
@@ -28,6 +28,9 @@
.text
ENTRY (__clone)
save %sp,-96,%sp
+ save %sp,-96,%sp
+ flushw
+ restore
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
index e5ff2cf..370d51f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
@@ -32,6 +32,9 @@
ENTRY (__clone)
save %sp, -192, %sp
+ save %sp, -192, %sp
+ flushw
+ restore
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)