]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: Fix longjmp early in initialization
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 18 Jul 2020 13:08:03 +0000 (15:08 +0200)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Sat, 18 Jul 2020 13:08:03 +0000 (15:08 +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
sysdeps/mach/hurd/i386/__longjmp.S

index 4d3a331728d755ce0eef9ecaf8a497e9be7e5331..5131386c60a4e2f260c181c42b7918c051d86c71 100644 (file)
@@ -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
index d123c214c96861dacbb0b22364abf7e4cea43d2b..73bbff9826182a062515ee88a845d234329097c3 100644 (file)
@@ -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