summaryrefslogtreecommitdiff
path: root/x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch
diff options
context:
space:
mode:
Diffstat (limited to 'x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch')
-rw-r--r--x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch b/x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch
new file mode 100644
index 0000000..c55bdf9
--- /dev/null
+++ b/x86-64-Fix-the-dtv-field-load-for-x32-BZ-31184.patch
@@ -0,0 +1,68 @@
+From 35ea7549751d4f13a28c732e6ad68204f5e60a06 Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools@gmail.com>
+Date: Wed, 20 Dec 2023 16:31:43 -0800
+Subject: [PATCH 4/9] x86-64: Fix the dtv field load for x32 [BZ #31184]
+
+On x32, I got
+
+FAIL: elf/tst-tlsgap
+
+$ gdb elf/tst-tlsgap
+...
+open tst-tlsgap-mod1.so
+
+Thread 2 "tst-tlsgap" received signal SIGSEGV, Segmentation fault.
+[Switching to LWP 2268754]
+_dl_tlsdesc_dynamic () at ../sysdeps/x86_64/dl-tlsdesc.S:108
+108 movq (%rsi), %rax
+(gdb) p/x $rsi
+$4 = 0xf7dbf9005655fb18
+(gdb)
+
+This is caused by
+
+_dl_tlsdesc_dynamic:
+ _CET_ENDBR
+ /* Preserve call-clobbered registers that we modify.
+ We need two scratch regs anyway. */
+ movq %rsi, -16(%rsp)
+ movq %fs:DTV_OFFSET, %rsi
+
+Since the dtv field in TCB is a pointer, %fs:DTV_OFFSET is a 32-bit
+location, not 64-bit. Load the dtv field to RSI_LP instead of rsi.
+This fixes BZ #31184.
+
+(cherry picked from commit 3502440397bbb840e2f7223734aa5cc2cc0e29b6)
+---
+ NEWS | 1 +
+ sysdeps/x86_64/dl-tlsdesc.S | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/NEWS b/NEWS
+index 5ac488bf9b..71057e4793 100644
+--- a/NEWS
++++ b/NEWS
+@@ -37,6 +37,7 @@ The following bugs are resolved with this release:
+ [30804] F_GETLK, F_SETLK, and F_SETLKW value change for powerpc64 with
+ -D_FILE_OFFSET_BITS=64
+ [30842] Stack read overflow in getaddrinfo in no-aaaa mode (CVE-2023-4527)
++ [31184] FAIL: elf/tst-tlsgap
+
+
+ Version 2.38
+diff --git a/sysdeps/x86_64/dl-tlsdesc.S b/sysdeps/x86_64/dl-tlsdesc.S
+index 5593897e29..c4823547d7 100644
+--- a/sysdeps/x86_64/dl-tlsdesc.S
++++ b/sysdeps/x86_64/dl-tlsdesc.S
+@@ -102,7 +102,7 @@ _dl_tlsdesc_dynamic:
+ /* Preserve call-clobbered registers that we modify.
+ We need two scratch regs anyway. */
+ movq %rsi, -16(%rsp)
+- movq %fs:DTV_OFFSET, %rsi
++ mov %fs:DTV_OFFSET, %RSI_LP
+ movq %rdi, -8(%rsp)
+ movq TLSDESC_ARG(%rax), %rdi
+ movq (%rsi), %rax
+--
+2.33.0
+