Applied, thanks!
Mike Kelly, le lun. 02 févr. 2026 07:25:02 +0000, a ecrit:
> Handling a pending signal calls _hurd_setup_sighandler() once again after the
> initial signal handling. In this case a pointer to the previous sigcontext is
> available to supply the interrupted thread's original basic state, fpu state
> and fpu XSTATE. The original XSTATE was not being preserved by the pending
> signal but instead overwritten with the active XSTATE. XSTATE register values
> modified by the signal handling code could therefore be wrongly propogated
> back
> to the interrupted user code.
> ---
> sysdeps/mach/hurd/i386/bits/sigcontext.h | 1 +
> sysdeps/mach/hurd/x86/trampoline.c | 69 ++++++++++++++--------
> sysdeps/mach/hurd/x86_64/bits/sigcontext.h | 1 +
> 3 files changed, 47 insertions(+), 24 deletions(-)
>
> diff --git a/sysdeps/mach/hurd/i386/bits/sigcontext.h
> b/sysdeps/mach/hurd/i386/bits/sigcontext.h
> index eefc5bbeb8..0e12e26da9 100644
> --- a/sysdeps/mach/hurd/i386/bits/sigcontext.h
> +++ b/sysdeps/mach/hurd/i386/bits/sigcontext.h
> @@ -90,6 +90,7 @@ struct sigcontext
> int sc_fpexcsr; /* FPSR including exception bits. */
>
> struct i386_xfloat_state *xstate;
> + size_t xstate_size;
> };
>
> /* Traditional BSD names for some members. */
> diff --git a/sysdeps/mach/hurd/x86/trampoline.c
> b/sysdeps/mach/hurd/x86/trampoline.c
> index d1c30fbb49..71bf61b0da 100644
> --- a/sysdeps/mach/hurd/x86/trampoline.c
> +++ b/sysdeps/mach/hurd/x86/trampoline.c
> @@ -151,9 +151,9 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, const
> struct sigaction *action
> ucontext_t ucontext;
> siginfo_t siginfo;
> #ifdef __x86_64__
> - char _pad2[56];
> + char _pad2[48];
> #else
> - char _pad2[20];
> + char _pad2[16];
> #endif
> char xstate[];
> /* Don't add anything after xstate, as it's dynamically
> @@ -170,29 +170,32 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, const
> struct sigaction *action
> /* We have a previous sigcontext that sigreturn was about
> to restore when another signal arrived. We will just base
> our setup on that. */
> - if (! _hurdsig_catch_memory_fault (ss->context))
> {
> memcpy (&state->basic, &ss->context->sc_i386_thread_state,
> sizeof (state->basic));
> memcpy (&state->fpu, &ss->context->sc_i386_float_state,
> sizeof (state->fpu));
> state->set |= (1 << i386_REGS_SEGS_STATE) | (1 << i386_FLOAT_STATE);
> +
> + xstate_size = ss->context->xstate_size;
> }
> }
> -
> - if (! machine_get_basic_state (ss->thread, state))
> - return NULL;
> -
> - /* Initialize the size of the CPU extended state, to be saved during
> - * signal handling */
> + else
> + {
> + /* Initialize the size of the CPU extended state, to be saved during
> + * signal handling */
> #ifdef i386_XFLOAT_STATE
> - _Static_assert ((sizeof(*stackframe) + sizeof(struct i386_xfloat_state)) %
> 64 == 0,
> - "stackframe size must be multiple of 64-byte minus "
> - "sizeof(struct i386_xfloat_state), please adjust _pad2");
> + _Static_assert ((sizeof(*stackframe) + sizeof(struct
> i386_xfloat_state)) % 64 == 0,
> + "stackframe size must be multiple of 64-byte minus "
> + "sizeof(struct i386_xfloat_state), please adjust _pad2");
>
> - if (__i386_get_xstate_size(__mach_host_self(), &xstate_size))
> + if (__i386_get_xstate_size(__mach_host_self(), &xstate_size))
> #endif
> - xstate_size = 0;
> + xstate_size = 0;
> + }
> +
> + if (! machine_get_basic_state (ss->thread, state))
> + return NULL;
>
> /* Save the original SP in the gratuitous `esp' slot.
> We may need to reset the SP (the `uesp' slot) to avoid clobbering an
> @@ -279,33 +282,51 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, const
> struct sigaction *action
> memcpy (&scp->sc_i386_thread_state,
> &state->basic, sizeof (state->basic));
>
> + scp->xstate_size = 0;
> scp->xstate = NULL;
> #ifdef i386_XFLOAT_STATE
> if (xstate_size > 0)
> {
> - mach_msg_type_number_t got = (xstate_size / sizeof (int));
> + if (ss->context != NULL)
> + {
> + assert(ss->context->xstate != NULL);
> +
> + /* Copy the xstate preserved at the time of handling the first
> + signal rather than that currently in the FPU. */
> + memcpy(stackframe->xstate, ss->context->xstate, xstate_size);
> + ok = 1;
> + }
> + else
> + {
> + mach_msg_type_number_t got = (xstate_size / sizeof (int));
>
> - ok = (! __thread_get_state (ss->thread, i386_XFLOAT_STATE,
> - (thread_state_t) stackframe->xstate,
> &got)
> - && got == (xstate_size / sizeof (int)));
> + ok = (! __thread_get_state (ss->thread, i386_XFLOAT_STATE,
> + (thread_state_t) stackframe->xstate,
> &got)
> + && got == (xstate_size / sizeof (int)));
>
> - if (ok && ((struct i386_xfloat_state*)
> stackframe->xstate)->fp_save_kind > 5)
> - /* We support up to XSAVES */
> - ok = 0;
> + if (ok && ((struct i386_xfloat_state*)
> stackframe->xstate)->fp_save_kind > 5)
> + /* We support up to XSAVES */
> + ok = 0;
> + }
>
> - if (ok)
> + if (ok)
> {
> scp->xstate = (struct i386_xfloat_state*) stackframe->xstate;
> + scp->xstate_size = xstate_size;
> assert((uintptr_t)scp->xstate->hw_state % 64 == 0);
> }
> - }
> + }
> else
> #endif
> ok = 0;
> if (!ok)
> {
> /* struct sigcontext is laid out so that starting at sc_fpkind
> mimics
> - a struct i386_float_state. */
> + a struct i386_float_state. In the event that we are processing a
> + previous sigcontext (ss->context != NULL) 'state' correctly contains
> + the FPU state saved from the previous handler (see memcpy above)
> + rather than that currently in the FPU */
> +
> _Static_assert (offsetof (struct sigcontext, sc_i386_float_state)
> % __alignof__ (struct i386_float_state) == 0,
> "sc_i386_float_state layout mismatch");
> diff --git a/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
> b/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
> index 94061e7a91..770523949c 100644
> --- a/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
> +++ b/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
> @@ -98,6 +98,7 @@ struct sigcontext
> int sc_fpexcsr; /* FPSR including exception bits. */
>
> struct i386_xfloat_state *xstate;
> + size_t xstate_size;
> };
>
> /* Traditional BSD names for some members. */
> --
> 2.47.3
>
>
--
Samuel
> Subject: pb fvwm95-2 comment l'installer le compiler???
> Merci d'avance
je te conseille d'être un peu plus précis dans l'exposé de ton pb...
-+- EJ in guide du linuxien pervers :"Les modéros sont sympas !" -+-