commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd,commited] hurd: Fix longjmp early in initialization


From: Samuel Thibault
Subject: [hurd,commited] hurd: Fix longjmp early in initialization
Date: Sat, 18 Jul 2020 15:11:52 +0200

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.
---
 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 4d3a331728..5131386c60 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
+       jnz     .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 d123c214c9..73bbff9826 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
+       jnz     .Lok            /* sigstate not initialized yet */
 
        testl   $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + 
SIGALTSTACK__SS_FLAGS__OFFSET)(%edi)
        jz      .Lok
-- 
2.27.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]