From 651a1545c8b6150051a0b44857136efd419afc6f Mon Sep 17 00:00:00 2001 From: Jia Tan Date: Sat, 9 Mar 2024 09:20:57 +0800 Subject: liblzma: Fix false Valgrind error report with GCC. With GCC and a certain combination of flags, Valgrind will falsely trigger an invalid write. This appears to be due to the omission of instructions to properly save, set up, and restore the frame pointer. The IFUNC resolver is a leaf function since it only calls a function that is inlined. So sometimes GCC omits the frame pointer instructions in the resolver unless this optimization is explictly disabled. This fixes https://bugzilla.redhat.com/show_bug.cgi?id=2267598. --- src/liblzma/check/crc32_fast.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src/liblzma/check/crc32_fast.c') diff --git a/src/liblzma/check/crc32_fast.c b/src/liblzma/check/crc32_fast.c index 079051f1..719d696c 100644 --- a/src/liblzma/check/crc32_fast.c +++ b/src/liblzma/check/crc32_fast.c @@ -135,15 +135,12 @@ typedef uint32_t (*crc32_func_type)( // This resolver is shared between all three dispatch methods. It serves as // the ifunc resolver if ifunc is supported, otherwise it is called as a // regular function by the constructor or first call resolution methods. -// The __no_profile_instrument_function__ attribute support is checked when -// determining if ifunc can be used, so it is safe to use here. -#ifdef CRC_USE_IFUNC -__attribute__((__no_profile_instrument_function__)) -#endif +// The funcion attributes are needed for safe IFUNC resolver usage with GCC. +lzma_resolver_attributes static crc32_func_type crc32_resolve(void) { - return is_arch_extension_supported() + return is_arch_extension_supported() ? &crc32_arch_optimized : &crc32_generic; } -- cgit v1.2.3