hurd: Align signal stack pointer after allocating stackframe
authorSergey Bugaev <bugaevc@gmail.com>
Mon, 15 May 2023 08:33:21 +0000 (11:33 +0300)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 16 May 2023 14:08:58 +0000 (16:08 +0200)
sizeof (*stackframe) appears to be divisible by 16, but we should not
rely on that. So make sure to leave enough space for the stackframe
first, and then align the final pointer at 16 bytes.

Checked on x86_64-gnu.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20230515083323.1358039-3-bugaevc@gmail.com>

sysdeps/mach/hurd/x86/trampoline.c

index 19bddad8e16af00e336d7d083ab4a492cbe28945..1f92064ebfefb2af5b353b4f4fa4fe5ad2b4b392 100644 (file)
@@ -196,15 +196,14 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, const struct sigaction *action
 #endif
     }
 
+  /* Push the arguments to call `trampoline' on the stack.  */
+  sigsp -= sizeof (*stackframe);
 #ifdef __x86_64__
   /* Align SP at 16 bytes.  Coupled with the fact that sigreturn_addr is
      16-byte aligned within the stackframe struct, this ensures that it ends
      up on a 16-byte aligned address, as required by the ABI.  */
   sigsp = (void *) ((uintptr_t) sigsp & ~15UL);
 #endif
-
-  /* Push the arguments to call `trampoline' on the stack.  */
-  sigsp -= sizeof (*stackframe);
   stackframe = sigsp;
 
   if (_hurdsig_catch_memory_fault (stackframe))