mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-17 16:47:50 +00:00
struct parasite_ctl, parasite_thread_ctl, and plain_regs_struct all contain user_fpregs_struct_t (typedef for struct xsave_struct), which is declared with __aligned(64). When these structs are allocated on the heap with xmalloc/xzalloc (i.e. malloc/calloc), the allocator only guarantees 16-byte alignment on x86_64. The compiler, seeing the __aligned(64) attribute on the struct type, may emit aligned memory instructions (e.g. movaps, vmovdqa) for struct copies, assuming the memory is properly aligned. When the heap pointer is not 64-byte aligned, these instructions trigger a General Protection Fault (#GP). This was observed as a crash in save_regs_plain() at infect.c:1314 (prs->regs = *r) on CentOS Stream 10 under QEMU/KVM, where the compiler generated aligned vector instructions for the struct copy. The crash did not reproduce on bare metal with a different compiler version that happened to emit unaligned instructions. Add xmemalign() wrapper around posix_memalign() to xmalloc.h and use it for all three allocation sites: - compel_prepare_noctx(): struct parasite_ctl - compel_prepare_thread(): struct parasite_thread_ctl - compel_prepare(): struct plain_regs_struct Memory from posix_memalign() can be freed with free(), so no changes to cleanup paths are needed. Assisted-by: Claude:claude-opus-4-6 Signed-off-by: Adrian Reber <areber@redhat.com> |
||
|---|---|---|
| .. | ||
| common | ||
| apparmor.h | ||