From 512b5406686a03a557361696614915164ff0f8af Mon Sep 17 00:00:00 2001 From: Pranav P Date: Fri, 16 Oct 2026 13:46:18 +0530 Subject: [PATCH] Fix: Test failures on s390x due to endianness issues --- third_party/streamvbyte | 2 +- vbz/vbz.cpp | 33 +++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/third_party/streamvbyte b/third_party/streamvbyte index 862c2e7..edc6105 160000 --- a/third_party/streamvbyte +++ b/third_party/streamvbyte @@ -1 +1 @@ -Subproject commit 862c2e7a4c39717b5a6e590c8a784bcd7924b20b +Subproject commit edc6105b24e150cd109ece75e6e37f54291635b0 diff --git a/vbz/vbz.cpp b/vbz/vbz.cpp index d57f174..18dcf19 100644 --- a/vbz/vbz.cpp +++ b/vbz/vbz.cpp @@ -54,6 +54,22 @@ struct VbzSizedHeader vbz_size_t original_size; }; +static inline void write_sized_header(gsl::span dest, vbz_size_t size) { + auto* ptr = reinterpret_cast(dest.data()); + ptr[0] = static_cast(size); + ptr[1] = static_cast(size >> 8); + ptr[2] = static_cast(size >> 16); + ptr[3] = static_cast(size >> 24); +} + +static inline vbz_size_t read_sized_header(gsl::span src) { + auto const* ptr = reinterpret_cast(src.data()); + return static_cast(ptr[0]) + | (static_cast(ptr[1]) << 8) + | (static_cast(ptr[2]) << 16) + | (static_cast(ptr[3]) << 24); +} + } extern "C" { @@ -312,9 +328,8 @@ vbz_size_t vbz_compress_sized( auto dest_buffer = make_data_buffer(destination, destination_capacity); - // Extract header information - auto header_span = dest_buffer.subspan(0, sizeof(VbzSizedHeader)).as_span(); - header_span[0].original_size = source_size; + // Write header information in little-endian + write_sized_header(dest_buffer, source_size); // Compress data info remaining dest buffer auto dest_compressed_data = dest_buffer.subspan(sizeof(VbzSizedHeader)); @@ -347,10 +362,9 @@ vbz_size_t vbz_decompress_sized( return VBZ_INPUT_SIZE_ERROR; } - // Extract header information - auto header_bytes = source_buffer.subspan(0, sizeof(VbzSizedHeader)); - auto source_header = header_bytes.as_span().begin(); - if (destination_capacity < source_header->original_size) + // Extract header information in little-endian + auto const original_size = read_sized_header(source_buffer); + if (destination_capacity < original_size) { return VBZ_DESTINATION_SIZE_ERROR; } @@ -361,7 +375,7 @@ vbz_size_t vbz_decompress_sized( src_compressed_data.data(), vbz_size_t(src_compressed_data.size()), destination, - source_header->original_size, + original_size, options ); } @@ -381,8 +395,7 @@ vbz_size_t vbz_decompressed_size( return VBZ_INPUT_SIZE_ERROR; } - auto header_span = source_buffer.subspan(0, sizeof(VbzSizedHeader)).as_span(); - return header_span[0].original_size; + return read_sized_header(source_buffer); }