git-fix-longjmp
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Wed, 30 Apr 2025 01:01:35 +0000 (09:01 +0800)
committerSean Whitton <spwhitton@spwhitton.name>
Wed, 30 Apr 2025 01:01:35 +0000 (09:01 +0800)
Committed for glibc 2.32

commit 115bcf921a52005b89ff2859ccae4a8fc6d6deed
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
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
sysdeps/mach/hurd/i386/__longjmp.S

index 4d3a331728d755ce0eef9ecaf8a497e9be7e5331..a746a4f2ba97a86fc821bf1342edb4e0d9bad1a9 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
+       jz      .Lok            /* sigstate not initialized yet */
 
        testl   $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi)
        jnz     .Lonstack
index d123c214c96861dacbb0b22364abf7e4cea43d2b..af788ede0ffc133cdeb2e358ac9cfcf4f8d3a70a 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
+       jz      .Lok            /* sigstate not initialized yet */
 
        testl   $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi)
        jz      .Lok