From: Samuel Thibault Date: Sun, 4 Jan 2026 20:40:35 +0000 (+0100) Subject: hurd: check that signal processing does not hurt the x86_64 redzone X-Git-Tag: glibc-2.43~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d942f309e3a93dd35c607fe41009f4357ba1d482;p=thirdparty%2Fglibc.git hurd: check that signal processing does not hurt the x86_64 redzone --- diff --git a/sysdeps/mach/hurd/x86_64/Makefile b/sysdeps/mach/hurd/x86_64/Makefile index 2b43f5d625..270705ac66 100644 --- a/sysdeps/mach/hurd/x86_64/Makefile +++ b/sysdeps/mach/hurd/x86_64/Makefile @@ -4,6 +4,11 @@ ifeq ($(subdir),conform) conformtest-xfail-conds += x86_64-gnu endif +ifeq ($(subdir),hurd) +tests += tst-sig-redzone +$(objpfx)tst-sig-redzone: $(shared-thread-library) +endif + ifeq ($(subdir),stdlib) sysdep_routines += __start_context endif diff --git a/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c b/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c new file mode 100644 index 0000000000..0855bd6900 --- /dev/null +++ b/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c @@ -0,0 +1,109 @@ +/* Test the redzone is not affected during signal handling. + + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static volatile atomic_bool startflag = ATOMIC_VAR_INIT (false); +static volatile atomic_bool loopflag = ATOMIC_VAR_INIT (true); + +void handler (int signum, siginfo_t *info, void *context) +{ + char buf[128]; + memset (buf, 0x77, sizeof buf); + printf ("signal %d hurting stack a bit\n", signum); + atomic_store_explicit (&loopflag, false, memory_order_release); +} + +/* Helper thread to send a signal to the main thread */ +void* signal_sender (void *arg) +{ + sigset_t ss; + assert (! sigemptyset (&ss)); + assert (! sigaddset (&ss, SIGUSR1)); + assert (! sigprocmask (SIG_BLOCK, &ss, NULL)); + + while (!atomic_load_explicit (&startflag, memory_order_acquire)) + ; + TEST_COMPARE (kill (getpid (), SIGUSR1), 0); + + return NULL; +} + +static int do_test (void) +{ + struct sigaction act = { 0 }; + act.sa_sigaction = &handler; + TEST_COMPARE (sigaction (SIGUSR1, &act, NULL), 0); + + pthread_t thsender = xpthread_create (NULL, signal_sender, NULL); + + int check_redzone (void); + TEST_COMPARE (check_redzone (), 0); + + xpthread_join (thsender); + return EXIT_SUCCESS; +} + +asm ( +"check_redzone:\n" + +" movabs $0x3333333333333333, %rax\n" +" mov $(128/8), %ecx\n" +" lea -128(%rsp), %rdi\n" +"rep stosq\n" + +" movl $1, startflag(%rip)\n" +"wait:\n" +" cmpl $0, loopflag(%rip)\n" +" jne wait\n" + +" movabs $0x3333333333333333, %rax\n" +" mov $(128/8), %ecx\n" +" lea -128(%rsp), %rdi\n" +"repe scasq\n" +" jne fail\n" + +" xor %rax,%rax\n" +" ret\n" +"fail:\n" +" movq $1,%rax\n" +" ret\n" +); + +#include