From 74684a3fba45f47f6abcd390f60a46c44f840c51 Mon Sep 17 00:00:00 2001 From: GNU Libc Maintainers Date: Wed, 30 Apr 2025 09:01:35 +0800 Subject: [PATCH] git-fix-longjmp Committed for glibc 2.32 commit 115bcf921a52005b89ff2859ccae4a8fc6d6deed Author: Samuel Thibault Date: Sat Jul 18 15:08:03 2020 +0200 hurd: Fix longjmp early in initialization When e.g. an LD_PRELOAD fails, _dl_signal_exception/error longjmps, but TLS is not initialized yet, let along signal state. We thus mustn't look at them within __longjmp. * sysdeps/mach/hurd/i386/____longjmp_chk.S,__longjmp.S: Check for initialized value of %gs, and that sigstate is non-NULL. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-fix-longjmp.diff --- sysdeps/mach/hurd/i386/____longjmp_chk.S | 9 ++++++++- sysdeps/mach/hurd/i386/__longjmp.S | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sysdeps/mach/hurd/i386/____longjmp_chk.S b/sysdeps/mach/hurd/i386/____longjmp_chk.S index 4d3a33172..a746a4f2b 100644 --- a/sysdeps/mach/hurd/i386/____longjmp_chk.S +++ b/sysdeps/mach/hurd/i386/____longjmp_chk.S @@ -60,7 +60,14 @@ ENTRY (____longjmp_chk) PTR_DEMANGLE (%ecx) #endif - movl %gs:SIGSTATE_OFFSET,%edi + movw %ds, %si + movw %gs, %di + cmpw %si, %di + jz .Lok /* TLS not initialized yet */ + + movl %gs:SIGSTATE_OFFSET, %edi + testl %edi, %edi + jz .Lok /* sigstate not initialized yet */ testl $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi) jnz .Lonstack diff --git a/sysdeps/mach/hurd/i386/__longjmp.S b/sysdeps/mach/hurd/i386/__longjmp.S index d123c214c..af788ede0 100644 --- a/sysdeps/mach/hurd/i386/__longjmp.S +++ b/sysdeps/mach/hurd/i386/__longjmp.S @@ -38,7 +38,14 @@ ENTRY (__longjmp) PTR_DEMANGLE (%ecx) #endif - movl %gs:SIGSTATE_OFFSET,%edi + movw %ds, %si + movw %gs, %di + cmpw %si, %di + jz .Lok /* TLS not initialized yet */ + + movl %gs:SIGSTATE_OFFSET, %edi + testl %edi, %edi + jz .Lok /* sigstate not initialized yet */ testl $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi) jz .Lok -- 2.30.2