]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
liblzma: Fix -fsanitize=address failure with crc_clmul functions.
authorJia Tan <jiat0218@gmail.com>
Wed, 18 Oct 2023 16:22:50 +0000 (00:22 +0800)
committerJia Tan <jiat0218@gmail.com>
Wed, 18 Oct 2023 17:15:20 +0000 (01:15 +0800)
After forcing crc_simd_body() to always be inlined it caused
-fsanitize=address to fail for lzma_crc32_clmul() and
lzma_crc64_clmul(). The __no_sanitize_address__ attribute was added
to lzma_crc32_clmul() and lzma_crc64_clmul(), but not removed from
crc_simd_body(). ASAN and inline functions behavior has changed over
the years for GCC specifically, so while strictly required we will
keep __attribute__((__no_sanitize_address__)) on crc_simd_body() in
case this becomes a requirement in the future.

Older GCC versions refuse to inline a function with ASAN if the
caller and callee do not agree on sanitization flags
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89124#c3). If the
function was forced to be inlined, it will not compile if the callee
function has __no_sanitize_address__ but the caller doesn't.

src/liblzma/check/crc_clmul.c

index b90f43e31a856d49a82c05fec12a257c8f6acd0f..7110fd7ef7bd035fa6bc448eb3b010b4921119df 100644 (file)
@@ -227,6 +227,9 @@ calc_hi(uint64_t p, uint64_t a, int n)
 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__)
 __attribute__((__target__("ssse3,sse4.1,pclmul")))
 #endif
+#if lzma_has_attribute(__no_sanitize_address__)
+__attribute__((__no_sanitize_address__))
+#endif
 extern uint32_t
 lzma_crc32_clmul(const uint8_t *buf, size_t size, uint32_t crc)
 {
@@ -317,6 +320,9 @@ calc_hi(uint64_t poly, uint64_t a)
 #if (defined(__GNUC__) || defined(__clang__)) && !defined(__EDG__)
 __attribute__((__target__("ssse3,sse4.1,pclmul")))
 #endif
+#if lzma_has_attribute(__no_sanitize_address__)
+__attribute__((__no_sanitize_address__))
+#endif
 extern uint64_t
 lzma_crc64_clmul(const uint8_t *buf, size_t size, uint64_t crc)
 {