From 80bdfe59a1b16fc302e0e5a55df5a0a81e438b67 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Sat, 1 Mar 2025 05:43:08 +0100 Subject: [PATCH 1/2] uint16_t is 2 bytes wide - only read 2 bytes from mem --- src/isal/isal_zlibmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/isal/isal_zlibmodule.c b/src/isal/isal_zlibmodule.c index 48bf6861..67547be9 100644 --- a/src/isal/isal_zlibmodule.c +++ b/src/isal/isal_zlibmodule.c @@ -1643,7 +1643,7 @@ static inline uint32_t load_u32_le(void *address) { static inline uint16_t load_u16_le(void *address) { #if PY_BIG_ENDIAN uint8_t *mem = address; - return mem[0] | (mem[1] << 8) | (mem[2] << 16) | (mem[3] << 24); + return mem[0] | (mem[1] << 8); #else return *(uint16_t *)address; #endif From 3bb00e48fa0c7d6af0018112cf3cd6aa65b0f7a3 Mon Sep 17 00:00:00 2001 From: Mattias Ellert Date: Sat, 1 Mar 2025 05:45:41 +0100 Subject: [PATCH 2/2] Reverse the order of copied bytes on big-endian Fixes test failures on s390x. --- CHANGELOG.rst | 2 ++ src/isal/isal_shared.h | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f68a9cdc..66921aa1 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,6 +12,8 @@ version develop ----------------- + Use upstream ISA-L version 2.31.1 which includes patches to make installation possible. ++ Fix a bug where bytes were copied in the wrong order on big endian + architectures. Fixes test failures on s390x. version 1.7.1 ----------------- diff --git a/src/isal/isal_shared.h b/src/isal/isal_shared.h index 1a01f081..61610276 100644 --- a/src/isal/isal_shared.h +++ b/src/isal/isal_shared.h @@ -207,8 +207,15 @@ static int bitbuffer_copy(struct inflate_state *state, char *to, size_t n){ int remainder = bits_in_buffer % 8; // Shift the 8-byte bitbuffer read_in so that the bytes are aligned. uint64_t remaining_bytes = state->read_in >> remainder; + #if PY_BIG_ENDIAN + char *remaining_buffer = (char *)&remaining_bytes; + for (int i = 0; i < n; ++i) { + to[i] = remaining_buffer[7-i]; + } + #else // memcpy works because of little-endianness memcpy(to, &remaining_bytes, n); + #endif return 0; }