Upstream-status: Taken from . See , and . Commited for 2.40 commit c8b4ce0b368115714bd4cce131e1683759471099 Author: Samuel Thibault Date: Sat Jul 13 17:00:55 2024 +0200 hurd: Fix restoring message to be retried save_data stores the start of the original message to be retried, overwritten by the EINTR reply. In 64b builds the overwrite is however rounded up to the 64b pointer size, so we have to save more than just the 32b err. Thanks a lot to Luca Dariz for the investigation! diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c index 2c2e7dc463..424c1fc700 100644 --- a/hurd/intr-msg.c +++ b/hurd/intr-msg.c @@ -42,7 +42,10 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, struct clobber { mach_msg_type_t type; - error_t err; + union { + error_t err; + uintptr_t align; + }; }; union msg { Taken from: Force putting save_data on the stack rather than in SSE register The signal management does not yet properly save SSE state, so that save_data would get overwritten by signal handlers, notably leading to `` shell replacement getting empty content because then the io_read RPC retry gets an MIG_BAD_ARGUMENTS error. XXX: This is only temporary to fix the common shll replacement issue, and is waiting for proper SSE state restoration. Index: glibc-2.38/hurd/intr-msg.c =================================================================== --- glibc-2.38.orig/hurd/intr-msg.c +++ glibc-2.38/hurd/intr-msg.c @@ -79,7 +79,7 @@ _hurd_intr_rpc_mach_msg (mach_msg_header mach_msg_bits_t msgh_bits; mach_port_t remote_port; mach_msg_id_t msgid; - struct clobber save_data; + volatile struct clobber save_data; if ((option & (MACH_SEND_MSG|MACH_RCV_MSG)) != (MACH_SEND_MSG|MACH_RCV_MSG) || _hurd_msgport_thread == MACH_PORT_NULL)