diff options
Diffstat (limited to 'gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch')
-rw-r--r-- | gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch b/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch new file mode 100644 index 0000000000..600f89a711 --- /dev/null +++ b/gnu/packages/patches/glibc-hurd64-intr-msg-clobber.patch @@ -0,0 +1,62 @@ +Upstream-status: Taken from <https://salsa.debian.org/glibc-team/glibc/-/blob/c36c87acb1a35d6e06db6cef1e28cf2f405e1a9e/debian/patches/hurd-i386/git-intr-msg-clobber.diff>. + +See <https://lists.gnu.org/archive/html/bug-hurd/2024-11/msg00115.html>, +and <https://lists.debian.org/debian-hurd/2024/07/msg00063.html>. + +Commited for 2.40 + +commit c8b4ce0b368115714bd4cce131e1683759471099 +Author: Samuel Thibault <[email protected]> +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: <https://salsa.debian.org/glibc-team/glibc/-/blob/027f94215a633cbf53794d4b48675fde36706e35/debian/patches/hurd-i386/local-intr-msg-clobber.diff> + +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) |