Source: libisal
Version: 2.30.0-4
Followup-For: Bug #1012262
X-Debbugs-Cc: scho...@ubuntu.com
Control: tags -1 patch

Here's a debdiff that incorporates the upstream patch.
diff -Nru libisal-2.30.0/debian/changelog libisal-2.30.0/debian/changelog
--- libisal-2.30.0/debian/changelog     2021-10-28 22:46:37.000000000 +0200
+++ libisal-2.30.0/debian/changelog     2022-06-02 14:05:49.000000000 +0200
@@ -1,3 +1,10 @@
+libisal (2.30.0-5) UNRELEASED; urgency=medium
+
+  * d/p/s390x-compat.patch: fix the build on s390x and other big-endian
+    architectures. (Closes #1012262, LP: #1976622)
+
+ -- Simon Chopin <scho...@ubuntu.com>  Thu, 02 Jun 2022 14:05:49 +0200
+
 libisal (2.30.0-4) unstable; urgency=medium
 
   * Fix symbols file for new architectures.
diff -Nru libisal-2.30.0/debian/patches/s390x-compat.patch 
libisal-2.30.0/debian/patches/s390x-compat.patch
--- libisal-2.30.0/debian/patches/s390x-compat.patch    1970-01-01 
01:00:00.000000000 +0100
+++ libisal-2.30.0/debian/patches/s390x-compat.patch    2022-06-02 
14:05:49.000000000 +0200
@@ -0,0 +1,1346 @@
+From d3cfb2fb772e375cf2007e484e0a6ec0c6a7c993 Mon Sep 17 00:00:00 2001
+From: Ilya Leoshkevich <i...@linux.ibm.com>
+Origin: upstream, 
https://github.com/intel/isa-l/commit/d3cfb2fb772e375cf2007e484e0a6ec0c6a7c993
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1012262
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/fastp/+bug/1976622
+Date: Thu, 11 Nov 2021 12:53:38 +0100
+Subject: [PATCH] Fix s390 build
+
+The goal of this patch is to make isa-l testsuite pass on s390 with
+minimal changes to the library. The one and only reason isa-l does not
+work on s390 at the moment is that s390 is big-endian, and isa-l
+assumes little-endian at a lot of places.
+
+There are two flavors of this: loading/storing integers from/to
+memory, and overlapping structs. Loads/stores are already helpfully
+wrapped by unaligned.h header, so replace the functions there with
+endianness-aware variants. Solve struct member overlap by reversing
+their order on big-endian.
+
+Also, fix a couple of usages of uninitialized memory in the testsuite
+(found with MemorySanitizer).
+
+Fixes s390x part of #188.
+
+Change-Id: Iaf14a113bd266900192cc8b44212f8a47a8c7753
+Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com>
+---
+ erasure_code/ec_base.c                        |   2 +-
+ igzip/bitbuf2.h                               |  17 +-
+ igzip/encode_df.h                             |   8 +-
+ igzip/generate_custom_hufftables.c            |   6 +-
+ igzip/huff_codes.c                            |   4 +-
+ igzip/huff_codes.h                            |  28 +++-
+ igzip/huffman.h                               |  86 +++++-----
+ igzip/igzip.c                                 |  40 ++---
+ igzip/igzip_base.c                            |  10 +-
+ igzip/igzip_icf_base.c                        |  14 +-
+ igzip/igzip_icf_body.c                        |  35 ++--
+ igzip/igzip_inflate.c                         |  53 +++---
+ igzip/igzip_rand_test.c                       |  11 +-
+ igzip/proc_heap_base.c                        |   6 +-
+ include/unaligned.h                           | 152 ++++++++++++++++--
+ mem/mem_zero_detect_base.c                    |   6 +-
+ .../fuzz/igzip_simple_round_trip_fuzz_test.c  |   4 +-
+ 17 files changed, 313 insertions(+), 169 deletions(-)
+
+diff --git a/erasure_code/ec_base.c b/erasure_code/ec_base.c
+index 9d76c8df..c0423cf3 100644
+--- a/erasure_code/ec_base.c
++++ b/erasure_code/ec_base.c
+@@ -171,7 +171,7 @@ void gf_vect_mul_init(unsigned char c, unsigned char *tbl)
+       unsigned char c4 = (c2 << 1) ^ ((c2 & 0x80) ? 0x1d : 0);        //Mult 
by GF{2}
+       unsigned char c8 = (c4 << 1) ^ ((c4 & 0x80) ? 0x1d : 0);        //Mult 
by GF{2}
+ 
+-#if __WORDSIZE == 64 || _WIN64 || __x86_64__
++#if (__WORDSIZE == 64 || _WIN64 || __x86_64__) && (__BYTE_ORDER__ == 
__ORDER_LITTLE_ENDIAN__)
+       unsigned long long v1, v2, v4, v8, *t;
+       unsigned long long v10, v20, v40, v80;
+       unsigned char c17, c18, c20, c24;
+diff --git a/igzip/bitbuf2.h b/igzip/bitbuf2.h
+index 51bd752d..5d886c0b 100644
+--- a/igzip/bitbuf2.h
++++ b/igzip/bitbuf2.h
+@@ -36,7 +36,6 @@
+ #define inline __inline
+ #endif
+ 
+-
+ /* MAX_BITBUF_BIT WRITE is the maximum number of bits than can be safely 
written
+  * by consecutive calls of write_bits. Note this assumes the bitbuf is in a
+  * state that is possible at the exit of write_bits */
+@@ -60,28 +59,28 @@ static inline int is_full(struct BitBuf2 *me)
+       return (me->m_out_buf > me->m_out_end);
+ }
+ 
+-static inline uint8_t * buffer_ptr(struct BitBuf2 *me)
++static inline uint8_t *buffer_ptr(struct BitBuf2 *me)
+ {
+       return me->m_out_buf;
+ }
+ 
+ static inline uint32_t buffer_used(struct BitBuf2 *me)
+ {
+-      return (uint32_t)(me->m_out_buf - me->m_out_start);
++      return (uint32_t) (me->m_out_buf - me->m_out_start);
+ }
+ 
+ static inline uint32_t buffer_bits_used(struct BitBuf2 *me)
+ {
+-      return (8 * (uint32_t)(me->m_out_buf - me->m_out_start) + 
me->m_bit_count);
++      return (8 * (uint32_t) (me->m_out_buf - me->m_out_start) + 
me->m_bit_count);
+ }
+ 
+ static inline void flush_bits(struct BitBuf2 *me)
+ {
+       uint32_t bits;
+-      store_u64(me->m_out_buf, me->m_bits);
++      store_le_u64(me->m_out_buf, me->m_bits);
+       bits = me->m_bit_count & ~7;
+       me->m_bit_count -= bits;
+-      me->m_out_buf += bits/8;
++      me->m_out_buf += bits / 8;
+       me->m_bits >>= bits;
+ 
+ }
+@@ -91,7 +90,7 @@ static inline void flush(struct BitBuf2 *me)
+ {
+       uint32_t bytes;
+       if (me->m_bit_count) {
+-              store_u64(me->m_out_buf, me->m_bits);
++              store_le_u64(me->m_out_buf, me->m_bits);
+               bytes = (me->m_bit_count + 7) / 8;
+               me->m_out_buf += bytes;
+       }
+@@ -114,14 +113,14 @@ static inline void write_bits_unsafe(struct BitBuf2 *me, 
uint64_t code, uint32_t
+ }
+ 
+ static inline void write_bits(struct BitBuf2 *me, uint64_t code, uint32_t 
count)
+-{     /* Assumes there is space to fit code into m_bits. */
++{                             /* Assumes there is space to fit code into 
m_bits. */
+       me->m_bits |= code << me->m_bit_count;
+       me->m_bit_count += count;
+       flush_bits(me);
+ }
+ 
+ static inline void write_bits_flush(struct BitBuf2 *me, uint64_t code, 
uint32_t count)
+-{     /* Assumes there is space to fit code into m_bits. */
++{                             /* Assumes there is space to fit code into 
m_bits. */
+       me->m_bits |= code << me->m_bit_count;
+       me->m_bit_count += count;
+       flush(me);
+diff --git a/igzip/encode_df.h b/igzip/encode_df.h
+index f3e4f754..0e25ccbd 100644
+--- a/igzip/encode_df.h
++++ b/igzip/encode_df.h
+@@ -20,11 +20,17 @@
+ #define ICF_CODE_LEN 32
+ 
+ struct deflate_icf {
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+       uint32_t lit_len:LIT_LEN_BIT_COUNT;
+       uint32_t lit_dist:DIST_LIT_BIT_COUNT;
+       uint32_t dist_extra:ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
++#else
++      uint32_t dist_extra:ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
++      uint32_t lit_dist:DIST_LIT_BIT_COUNT;
++      uint32_t lit_len:LIT_LEN_BIT_COUNT;
++#endif
+ };
+ 
+ struct deflate_icf *encode_deflate_icf(struct deflate_icf *next_in, struct 
deflate_icf *end_in,
+-                                     struct BitBuf2 *bb, struct 
hufftables_icf * hufftables);
++                                     struct BitBuf2 *bb, struct 
hufftables_icf *hufftables);
+ #endif
+diff --git a/igzip/generate_custom_hufftables.c 
b/igzip/generate_custom_hufftables.c
+index 449f7098..b27ee3cf 100644
+--- a/igzip/generate_custom_hufftables.c
++++ b/igzip/generate_custom_hufftables.c
+@@ -291,13 +291,13 @@ void isal_update_histogram_dict(uint8_t * start_stream, 
int dict_length, int len
+       memset(last_seen, 0, sizeof(histogram->hash_table));    /* Initialize 
last_seen to be 0. */
+ 
+       for (current = start_stream; current < end_dict - 4; current++) {
+-              literal = load_u32(current);
++              literal = load_le_u32(current);
+               hash = compute_hash(literal) & LVL0_HASH_MASK;
+               last_seen[hash] = (current - start_stream) & 0xFFFF;
+       }
+ 
+       for (current = start_stream + dict_length; current < end_stream - 3; 
current++) {
+-              literal = load_u32(current);
++              literal = load_le_u32(current);
+               hash = compute_hash(literal) & LVL0_HASH_MASK;
+               seen = last_seen[hash];
+               last_seen[hash] = (current - start_stream) & 0xFFFF;
+@@ -317,7 +317,7 @@ void isal_update_histogram_dict(uint8_t * start_stream, 
int dict_length, int len
+                                       end = end_stream - 3;
+                               next_hash++;
+                               for (; next_hash < end; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash(literal) & 
LVL0_HASH_MASK;
+                                       last_seen[hash] = (next_hash - 
start_stream) & 0xFFFF;
+                               }
+diff --git a/igzip/huff_codes.c b/igzip/huff_codes.c
+index 7512af23..11caed48 100644
+--- a/igzip/huff_codes.c
++++ b/igzip/huff_codes.c
+@@ -680,7 +680,7 @@ void isal_update_histogram_base(uint8_t * start_stream, 
int length,
+       end_stream = start_stream + length;
+       memset(last_seen, 0, sizeof(histogram->hash_table));    /* Initialize 
last_seen to be 0. */
+       for (current = start_stream; current < end_stream - 3; current++) {
+-              literal = load_u32(current);
++              literal = load_le_u32(current);
+               hash = compute_hash(literal) & LVL0_HASH_MASK;
+               seen = last_seen[hash];
+               last_seen[hash] = (current - start_stream) & 0xFFFF;
+@@ -700,7 +700,7 @@ void isal_update_histogram_base(uint8_t * start_stream, 
int length,
+                                       end = end_stream - 3;
+                               next_hash++;
+                               for (; next_hash < end; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash(literal) & 
LVL0_HASH_MASK;
+                                       last_seen[hash] = (next_hash - 
start_stream) & 0xFFFF;
+                               }
+diff --git a/igzip/huff_codes.h b/igzip/huff_codes.h
+index d353d27e..b8dd1da8 100644
+--- a/igzip/huff_codes.h
++++ b/igzip/huff_codes.h
+@@ -104,15 +104,26 @@
+  */
+ struct huff_code {
+       union {
+-                struct {
+-                        uint32_t code_and_extra:24;
+-                        uint32_t length2:8;
+-                };
++              struct {
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++                      uint32_t code_and_extra:24;
++                      uint32_t length2:8;
++#else
++                      uint32_t length2:8;
++                      uint32_t code_and_extra:24;
++#endif
++              };
+ 
+               struct {
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+                       uint16_t code;
+                       uint8_t extra_bit_count;
+                       uint8_t length;
++#else
++                      uint8_t length;
++                      uint8_t extra_bit_count;
++                      uint16_t code;
++#endif
+               };
+ 
+               uint32_t code_and_length;
+@@ -120,8 +131,13 @@ struct huff_code {
+ };
+ 
+ struct tree_node {
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+       uint32_t child;
+       uint32_t depth;
++#else
++      uint32_t depth;
++      uint32_t child;
++#endif
+ };
+ 
+ struct heap_tree {
+@@ -164,7 +180,7 @@ struct hufftables_icf {
+  * with the set hufftable
+  */
+ uint64_t
+-create_hufftables_icf(struct BitBuf2 *bb, struct hufftables_icf * hufftables,
+-                  struct isal_mod_hist *hist, uint32_t end_of_block);
++create_hufftables_icf(struct BitBuf2 *bb, struct hufftables_icf *hufftables,
++                    struct isal_mod_hist *hist, uint32_t end_of_block);
+ 
+ #endif
+diff --git a/igzip/huffman.h b/igzip/huffman.h
+index 2b44b617..bb46752a 100644
+--- a/igzip/huffman.h
++++ b/igzip/huffman.h
+@@ -58,15 +58,14 @@ static inline uint32_t bsr(uint32_t val)
+       if (val != 0) {
+               _BitScanReverse(&ret, val);
+               msb = ret + 1;
+-      }
+-      else
++      } else
+               msb = 0;
+ #elif defined( __LZCNT__)
+       msb = 32 - __lzcnt32(val);
+ #elif defined(__x86_64__) || defined(__aarch64__)
+-      msb = (val == 0)? 0 : 32 - __builtin_clz(val);
++      msb = (val == 0) ? 0 : 32 - __builtin_clz(val);
+ #else
+-      for(msb = 0; val > 0; val >>= 1)
++      for (msb = 0; val > 0; val >>= 1)
+               msb++;
+ #endif
+       return msb;
+@@ -81,17 +80,18 @@ static inline uint32_t tzbytecnt(uint64_t val)
+       cnt = cnt / 8;
+ #elif defined(__x86_64__) || defined(__aarch64__)
+ 
+-      cnt = (val == 0)? 64 : __builtin_ctzll(val);
++      cnt = (val == 0) ? 64 : __builtin_ctzll(val);
+       cnt = cnt / 8;
+ 
+ #else
+-      for(cnt = 8; val > 0; val <<= 8)
++      for (cnt = 8; val > 0; val <<= 8)
+               cnt -= 1;
+ #endif
+       return cnt;
+ }
+ 
+-static void compute_dist_code(struct isal_hufftables *hufftables, uint16_t 
dist, uint64_t *p_code, uint64_t *p_len)
++static void compute_dist_code(struct isal_hufftables *hufftables, uint16_t 
dist,
++                            uint64_t * p_code, uint64_t * p_len)
+ {
+       assert(dist > IGZIP_DIST_TABLE_SIZE);
+ 
+@@ -116,7 +116,8 @@ static void compute_dist_code(struct isal_hufftables 
*hufftables, uint16_t dist,
+       *p_len = len + num_extra_bits;
+ }
+ 
+-static inline void get_dist_code(struct isal_hufftables *hufftables, uint32_t 
dist, uint64_t *code, uint64_t *len)
++static inline void get_dist_code(struct isal_hufftables *hufftables, uint32_t 
dist,
++                               uint64_t * code, uint64_t * len)
+ {
+       if (dist < 1)
+               dist = 0;
+@@ -132,7 +133,8 @@ static inline void get_dist_code(struct isal_hufftables 
*hufftables, uint32_t di
+       }
+ }
+ 
+-static inline void get_len_code(struct isal_hufftables *hufftables, uint32_t 
length, uint64_t *code, uint64_t *len)
++static inline void get_len_code(struct isal_hufftables *hufftables, uint32_t 
length,
++                              uint64_t * code, uint64_t * len)
+ {
+       assert(length >= 3);
+       assert(length <= 258);
+@@ -143,7 +145,8 @@ static inline void get_len_code(struct isal_hufftables 
*hufftables, uint32_t len
+       *len = code_len & 0x1F;
+ }
+ 
+-static inline void get_lit_code(struct isal_hufftables *hufftables, uint32_t 
lit, uint64_t *code, uint64_t *len)
++static inline void get_lit_code(struct isal_hufftables *hufftables, uint32_t 
lit,
++                              uint64_t * code, uint64_t * len)
+ {
+       assert(lit <= 256);
+ 
+@@ -151,7 +154,7 @@ static inline void get_lit_code(struct isal_hufftables 
*hufftables, uint32_t lit
+       *len = hufftables->lit_table_sizes[lit];
+ }
+ 
+-static void compute_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t 
*extra_bits)
++static void compute_dist_icf_code(uint32_t dist, uint32_t * code, uint32_t * 
extra_bits)
+ {
+       uint32_t msb;
+       uint32_t num_extra_bits;
+@@ -166,7 +169,7 @@ static void compute_dist_icf_code(uint32_t dist, uint32_t 
*code, uint32_t *extra
+       assert(*code < 30);
+ }
+ 
+-static inline void get_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t 
*extra_bits)
++static inline void get_dist_icf_code(uint32_t dist, uint32_t * code, uint32_t 
* extra_bits)
+ {
+       assert(dist >= 1);
+       assert(dist <= 32768);
+@@ -178,7 +181,7 @@ static inline void get_dist_icf_code(uint32_t dist, 
uint32_t *code, uint32_t *ex
+       }
+ }
+ 
+-static inline void get_len_icf_code(uint32_t length, uint32_t *code)
++static inline void get_len_icf_code(uint32_t length, uint32_t * code)
+ {
+       assert(length >= 3);
+       assert(length <= 258);
+@@ -186,7 +189,7 @@ static inline void get_len_icf_code(uint32_t length, 
uint32_t *code)
+       *code = length + 254;
+ }
+ 
+-static inline void get_lit_icf_code(uint32_t lit, uint32_t *code)
++static inline void get_lit_icf_code(uint32_t lit, uint32_t * code)
+ {
+       assert(lit <= 256);
+ 
+@@ -234,9 +237,10 @@ static inline uint32_t compute_hash_mad(uint32_t data)
+       return data;
+ }
+ 
+-static inline uint32_t compute_long_hash(uint64_t data) {
++static inline uint32_t compute_long_hash(uint64_t data)
++{
+ 
+-      return compute_hash(data >> 32)^compute_hash(data);
++      return compute_hash(data >> 32) ^ compute_hash(data);
+ }
+ 
+ /**
+@@ -251,48 +255,48 @@ static inline int compare258(uint8_t * str1, uint8_t * 
str2, uint32_t max_length
+       uint64_t test;
+       uint64_t loop_length;
+ 
+-      if(max_length > 258)
++      if (max_length > 258)
+               max_length = 258;
+ 
+       loop_length = max_length & ~0x7;
+ 
+-      for(count = 0; count < loop_length; count += 8){
+-              test = load_u64(str1);
+-              test ^= load_u64(str2);
+-              if(test != 0)
++      for (count = 0; count < loop_length; count += 8) {
++              test = load_le_u64(str1);
++              test ^= load_le_u64(str2);
++              if (test != 0)
+                       return count + tzbytecnt(test);
+               str1 += 8;
+               str2 += 8;
+       }
+ 
+-      switch(max_length % 8){
++      switch (max_length % 8) {
+ 
+       case 7:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 6:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 5:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 4:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 3:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 2:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 1:
+-              if(*str1 != *str2)
++              if (*str1 != *str2)
+                       return count;
+               count++;
+       }
+@@ -314,43 +318,43 @@ static inline int compare(uint8_t * str1, uint8_t * 
str2, uint32_t max_length)
+ 
+       loop_length = max_length & ~0x7;
+ 
+-      for(count = 0; count < loop_length; count += 8){
+-              test = load_u64(str1);
+-              test ^= load_u64(str2);
+-              if(test != 0)
++      for (count = 0; count < loop_length; count += 8) {
++              test = load_le_u64(str1);
++              test ^= load_le_u64(str2);
++              if (test != 0)
+                       return count + tzbytecnt(test);
+               str1 += 8;
+               str2 += 8;
+       }
+ 
+-      switch(max_length % 8){
++      switch (max_length % 8) {
+ 
+       case 7:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 6:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 5:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 4:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 3:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 2:
+-              if(*str1++ != *str2++)
++              if (*str1++ != *str2++)
+                       return count;
+               count++;
+       case 1:
+-              if(*str1 != *str2)
++              if (*str1 != *str2)
+                       return count;
+               count++;
+       }
+diff --git a/igzip/igzip.c b/igzip/igzip.c
+index 3ec6afd3..dcaba0c5 100644
+--- a/igzip/igzip.c
++++ b/igzip/igzip.c
+@@ -54,20 +54,6 @@
+ #include "igzip_wrapper.h"
+ #include "unaligned.h"
+ 
+-#ifdef __FreeBSD__
+-#include <sys/types.h>
+-#include <sys/endian.h>
+-# define to_be32(x) bswap32(x)
+-#elif defined (__APPLE__)
+-#include <libkern/OSByteOrder.h>
+-# define to_be32(x) OSSwapInt32(x)
+-#elif defined (__GNUC__) && !defined (__MINGW32__)
+-# include <byteswap.h>
+-# define to_be32(x) bswap_32(x)
+-#elif defined _WIN64
+-# define to_be32(x) _byteswap_ulong(x)
+-#endif
+-
+ extern void isal_deflate_hash_lvl0(uint16_t *, uint32_t, uint32_t, uint8_t *, 
uint32_t);
+ extern void isal_deflate_hash_lvl1(uint16_t *, uint32_t, uint32_t, uint8_t *, 
uint32_t);
+ extern void isal_deflate_hash_lvl2(uint16_t *, uint32_t, uint32_t, uint8_t *, 
uint32_t);
+@@ -744,8 +730,8 @@ static int isal_deflate_int_stateless(struct isal_zstream 
*stream)
+                       return STATELESS_OVERFLOW;
+ 
+       if (stream->avail_in >= 8
+-          && (load_u64(stream->next_in) == 0
+-              || load_u64(stream->next_in) == ~(uint64_t) 0)) {
++          && (load_native_u64(stream->next_in) == 0
++              || load_native_u64(stream->next_in) == ~(uint64_t) 0)) {
+               repeat_length = detect_repeated_char_length(stream->next_in, 
stream->avail_in);
+ 
+               if (stream->avail_in == repeat_length || repeat_length >= 
MIN_REPEAT_LEN)
+@@ -809,6 +795,7 @@ static void write_type0_header(struct isal_zstream *stream)
+               stored_blk_hdr = stored_blk_hdr << 8;
+               stored_blk_hdr |= stream->internal_state.has_eob_hdr;
+               memcpy_len = TYPE0_HDR_LEN + 1;
++              stored_blk_hdr = to_le64(stored_blk_hdr);
+               memcpy(stream->next_out, &stored_blk_hdr, memcpy_len);
+       } else if (stream->avail_out >= 8) {
+               set_buf(bitbuf, stream->next_out, stream->avail_out);
+@@ -817,6 +804,7 @@ static void write_type0_header(struct isal_zstream *stream)
+               stream->total_out += buffer_used(bitbuf);
+               stream->avail_out -= buffer_used(bitbuf);
+               memcpy_len = TYPE0_HDR_LEN;
++              stored_blk_hdr = to_le64(stored_blk_hdr);
+               memcpy(stream->next_out, &stored_blk_hdr, memcpy_len);
+       } else {
+               stream->internal_state.has_eob_hdr = 0;
+@@ -1100,13 +1088,13 @@ uint32_t isal_write_gzip_header(struct isal_zstream 
*stream, struct isal_gzip_he
+       out_buf[1] = 0x8b;
+       out_buf[2] = DEFLATE_METHOD;
+       out_buf[3] = flags;
+-      store_u32(out_buf + 4, gz_hdr->time);
++      store_le_u32(out_buf + 4, gz_hdr->time);
+       out_buf[8] = gz_hdr->xflags;
+       out_buf[9] = gz_hdr->os;
+ 
+       out_buf += GZIP_HDR_BASE;
+       if (flags & EXTRA_FLAG) {
+-              store_u16(out_buf, gz_hdr->extra_len);
++              store_le_u16(out_buf, gz_hdr->extra_len);
+               out_buf += GZIP_EXTRA_LEN;
+ 
+               memcpy(out_buf, gz_hdr->extra, gz_hdr->extra_len);
+@@ -1125,7 +1113,7 @@ uint32_t isal_write_gzip_header(struct isal_zstream 
*stream, struct isal_gzip_he
+ 
+       if (flags & HCRC_FLAG) {
+               hcrc = crc32_gzip_refl(0, out_buf_start, out_buf - 
out_buf_start);
+-              store_u16(out_buf, hcrc);
++              store_le_u16(out_buf, hcrc);
+               out_buf += GZIP_HCRC_LEN;
+       }
+ 
+@@ -1158,7 +1146,7 @@ uint32_t isal_write_zlib_header(struct isal_zstream 
*stream, struct isal_zlib_he
+       out_buf[1] = flg;
+ 
+       if (dict_flag)
+-              store_u32(out_buf + 2, z_hdr->dict_id);
++              store_le_u32(out_buf + 2, z_hdr->dict_id);
+ 
+       stream->next_out += hdr_size;
+       stream->total_out += hdr_size;
+@@ -1877,7 +1865,7 @@ static int 
write_deflate_header_unaligned_stateless(struct isal_zstream *stream)
+       header_end = header_next +
+           (hufftables->deflate_hdr_count / sizeof(header_bits)) * 
sizeof(header_bits);
+ 
+-      header_bits = load_u64(header_next);
++      header_bits = load_le_u64(header_next);
+ 
+       if (stream->end_of_stream == 0)
+               header_bits--;
+@@ -1891,7 +1879,7 @@ static int 
write_deflate_header_unaligned_stateless(struct isal_zstream *stream)
+               write_bits(&state->bitbuf, header_bits, 32);
+               header_bits >>= 32;
+               write_bits(&state->bitbuf, header_bits, 32);
+-              header_bits = load_u64(header_next);
++              header_bits = load_le_u64(header_next);
+       }
+       bit_count =
+           (hufftables->deflate_hdr_count & 0x7) * 8 + 
hufftables->deflate_hdr_extra_bits;
+@@ -2032,7 +2020,8 @@ static void write_trailer(struct isal_zstream *stream)
+       case IGZIP_GZIP:
+       case IGZIP_GZIP_NO_HDR:
+               if (stream->avail_out - bytes >= gzip_trl_bytes) {
+-                      store_u64(stream->next_out, ((uint64_t) 
stream->total_in << 32) | crc);
++                      store_le_u64(stream->next_out,
++                                   ((uint64_t) stream->total_in << 32) | crc);
+                       stream->next_out += gzip_trl_bytes;
+                       bytes += gzip_trl_bytes;
+                       state->state = ZSTATE_END;
+@@ -2042,9 +2031,8 @@ static void write_trailer(struct isal_zstream *stream)
+       case IGZIP_ZLIB:
+       case IGZIP_ZLIB_NO_HDR:
+               if (stream->avail_out - bytes >= zlib_trl_bytes) {
+-                      store_u32(stream->next_out,
+-                                to_be32((crc & 0xFFFF0000) | ((crc & 0xFFFF) 
+ 1) %
+-                                        ADLER_MOD));
++                      store_be_u32(stream->next_out,
++                                   (crc & 0xFFFF0000) | ((crc & 0xFFFF) + 1) 
% ADLER_MOD);
+                       stream->next_out += zlib_trl_bytes;
+                       bytes += zlib_trl_bytes;
+                       state->state = ZSTATE_END;
+diff --git a/igzip/igzip_base.c b/igzip/igzip_base.c
+index bcc965f6..925d0800 100644
+--- a/igzip/igzip_base.c
++++ b/igzip/igzip_base.c
+@@ -58,7 +58,7 @@ void isal_deflate_body_base(struct isal_zstream *stream)
+                       return;
+               }
+ 
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash(literal) & hash_mask;
+               dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
+               last_seen[hash] = (uint64_t) (next_in - file_start);
+@@ -79,7 +79,7 @@ void isal_deflate_body_base(struct isal_zstream *stream)
+                               next_hash++;
+ 
+                               for (; next_hash < end; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash(literal) & 
hash_mask;
+                                       last_seen[hash] = (uint64_t) (next_hash 
- file_start);
+                               }
+@@ -140,7 +140,7 @@ void isal_deflate_finish_base(struct isal_zstream *stream)
+                               return;
+                       }
+ 
+-                      literal = load_u32(next_in);
++                      literal = load_le_u32(next_in);
+                       hash = compute_hash(literal) & hash_mask;
+                       dist = (next_in - file_start - last_seen[hash]) & 
0xFFFF;
+                       last_seen[hash] = (uint64_t) (next_in - file_start);
+@@ -159,7 +159,7 @@ void isal_deflate_finish_base(struct isal_zstream *stream)
+                                       next_hash++;
+ 
+                                       for (; next_hash < end - 3; 
next_hash++) {
+-                                              literal = load_u32(next_hash);
++                                              literal = 
load_le_u32(next_hash);
+                                               hash = compute_hash(literal) & 
hash_mask;
+                                               last_seen[hash] =
+                                                   (uint64_t) (next_hash - 
file_start);
+@@ -227,7 +227,7 @@ void isal_deflate_hash_base(uint16_t * hash_table, 
uint32_t hash_mask,
+       uint16_t index = current_index - dict_len;
+ 
+       while (next_in <= end_in) {
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash(literal) & hash_mask;
+               hash_table[hash] = index;
+               index++;
+diff --git a/igzip/igzip_icf_base.c b/igzip/igzip_icf_base.c
+index 1f031796..a74c1d52 100644
+--- a/igzip/igzip_icf_base.c
++++ b/igzip/igzip_icf_base.c
+@@ -73,7 +73,7 @@ void isal_deflate_icf_body_hash_hist_base(struct 
isal_zstream *stream)
+                       return;
+               }
+ 
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash(literal) & hash_mask;
+               dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
+               last_seen[hash] = (uint64_t) (next_in - file_start);
+@@ -94,7 +94,7 @@ void isal_deflate_icf_body_hash_hist_base(struct 
isal_zstream *stream)
+                               next_hash++;
+ 
+                               for (; next_hash < end; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash(literal) & 
hash_mask;
+                                       last_seen[hash] = (uint64_t) (next_hash 
- file_start);
+                               }
+@@ -168,7 +168,7 @@ void isal_deflate_icf_finish_hash_hist_base(struct 
isal_zstream *stream)
+                       return;
+               }
+ 
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash(literal) & hash_mask;
+               dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
+               last_seen[hash] = (uint64_t) (next_in - file_start);
+@@ -186,7 +186,7 @@ void isal_deflate_icf_finish_hash_hist_base(struct 
isal_zstream *stream)
+                               next_hash++;
+ 
+                               for (; next_hash < end - 3; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash(literal) & 
hash_mask;
+                                       last_seen[hash] = (uint64_t) (next_hash 
- file_start);
+                               }
+@@ -278,7 +278,7 @@ void isal_deflate_icf_finish_hash_map_base(struct 
isal_zstream *stream)
+                       return;
+               }
+ 
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash_mad(literal) & hash_mask;
+               dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
+               last_seen[hash] = (uint64_t) (next_in - file_start);
+@@ -296,7 +296,7 @@ void isal_deflate_icf_finish_hash_map_base(struct 
isal_zstream *stream)
+                               next_hash++;
+ 
+                               for (; next_hash < end - 3; next_hash++) {
+-                                      literal = load_u32(next_hash);
++                                      literal = load_le_u32(next_hash);
+                                       hash = compute_hash_mad(literal) & 
hash_mask;
+                                       last_seen[hash] = (uint64_t) (next_hash 
- file_start);
+                               }
+@@ -361,7 +361,7 @@ void isal_deflate_hash_mad_base(uint16_t * hash_table, 
uint32_t hash_mask,
+       uint16_t index = current_index - dict_len;
+ 
+       while (next_in <= end_in) {
+-              literal = load_u32(next_in);
++              literal = load_le_u32(next_in);
+               hash = compute_hash_mad(literal) & hash_mask;
+               hash_table[hash] = index;
+               index++;
+diff --git a/igzip/igzip_icf_body.c b/igzip/igzip_icf_body.c
+index 5d572323..20ff2303 100644
+--- a/igzip/igzip_icf_body.c
++++ b/igzip/igzip_icf_body.c
+@@ -20,8 +20,8 @@ static inline void write_deflate_icf(struct deflate_icf 
*icf, uint32_t lit_len,
+       /* icf->lit_dist = lit_dist; */
+       /* icf->dist_extra = extra_bits; */
+ 
+-      store_u32((uint8_t *) icf, lit_len | (lit_dist << LIT_LEN_BIT_COUNT)
+-                | (extra_bits << (LIT_LEN_BIT_COUNT + DIST_LIT_BIT_COUNT)));
++      store_native_u32((uint8_t *) icf, lit_len | (lit_dist << 
LIT_LEN_BIT_COUNT)
++                       | (extra_bits << (LIT_LEN_BIT_COUNT + 
DIST_LIT_BIT_COUNT)));
+ }
+ 
+ void set_long_icf_fg_base(uint8_t * next_in, uint64_t processed, uint64_t 
input_size,
+@@ -94,7 +94,7 @@ uint64_t gen_icf_map_h1_base(struct isal_zstream *stream,
+               matches_icf_lookup->lit_dist = 0x1e;
+               matches_icf_lookup->dist_extra = 0;
+ 
+-              hash = compute_hash(load_u32(next_in)) & hash_mask;
++              hash = compute_hash(load_le_u32(next_in)) & hash_mask;
+               hash_table[hash] = (uint64_t) (next_in - file_start);
+ 
+               next_in++;
+@@ -103,13 +103,13 @@ uint64_t gen_icf_map_h1_base(struct isal_zstream *stream,
+       }
+ 
+       while (next_in < end_in - ISAL_LOOK_AHEAD) {
+-              hash = compute_hash(load_u32(next_in)) & hash_mask;
++              hash = compute_hash(load_le_u32(next_in)) & hash_mask;
+               dist = (next_in - file_start - hash_table[hash]);
+               dist = ((dist - 1) & hist_size) + 1;
+               hash_table[hash] = (uint64_t) (next_in - file_start);
+ 
+-              match_bytes = load_u64(next_in - dist);
+-              next_bytes = load_u64(next_in);
++              match_bytes = load_le_u64(next_in - dist);
++              next_bytes = load_le_u64(next_in);
+               match = next_bytes ^ match_bytes;
+ 
+               len = tzbytecnt(match);
+@@ -147,13 +147,18 @@ static struct deflate_icf *compress_icf_map_g(struct 
isal_zstream *stream,
+           level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
+ 
+       while (matches_next < matches_end - 1 && level_buf->icf_buf_next < 
icf_buf_end - 1) {
+-              code = load_u64((uint8_t *) matches_next);
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++              code = load_native_u64((uint8_t *) matches_next);
++#else
++              code = load_native_u32((uint8_t *) matches_next) |
++                  ((uint64_t) load_native_u32((uint8_t *) (matches_next + 1)) 
<< 32);
++#endif
+               lit_len = code & LIT_LEN_MASK;
+               lit_len2 = (code >> ICF_CODE_LEN) & LIT_LEN_MASK;
+               level_buf->hist.ll_hist[lit_len]++;
+ 
+               if (lit_len >= LEN_START) {
+-                      store_u32((uint8_t *) level_buf->icf_buf_next, code);
++                      store_native_u32((uint8_t *) level_buf->icf_buf_next, 
code);
+                       level_buf->icf_buf_next++;
+ 
+                       dist = (code >> ICF_DIST_OFFSET) & DIST_LIT_MASK;
+@@ -162,7 +167,13 @@ static struct deflate_icf *compress_icf_map_g(struct 
isal_zstream *stream,
+                       matches_next += lit_len;
+ 
+               } else if (lit_len2 >= LEN_START) {
+-                      store_u64((uint8_t *) level_buf->icf_buf_next, code);
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++                      store_native_u64((uint8_t *) level_buf->icf_buf_next, 
code);
++#else
++                      store_native_u32((uint8_t *) level_buf->icf_buf_next, 
(uint32_t) code);
++                      store_native_u32((uint8_t *) (level_buf->icf_buf_next + 
1),
++                                       (uint32_t) (code >> 32));
++#endif
+                       level_buf->icf_buf_next += 2;
+ 
+                       level_buf->hist.ll_hist[lit_len2]++;
+@@ -174,7 +185,7 @@ static struct deflate_icf *compress_icf_map_g(struct 
isal_zstream *stream,
+ 
+               } else {
+                       code = ((lit_len2 + LIT_START) << ICF_DIST_OFFSET) | 
lit_len;
+-                      store_u32((uint8_t *) level_buf->icf_buf_next, code);
++                      store_native_u32((uint8_t *) level_buf->icf_buf_next, 
code);
+                       level_buf->icf_buf_next++;
+ 
+                       level_buf->hist.ll_hist[lit_len2]++;
+@@ -184,9 +195,9 @@ static struct deflate_icf *compress_icf_map_g(struct 
isal_zstream *stream,
+       }
+ 
+       while (matches_next < matches_end && level_buf->icf_buf_next < 
icf_buf_end) {
+-              code = load_u32((uint8_t *) matches_next);
++              code = load_native_u32((uint8_t *) matches_next);
+               lit_len = code & LIT_LEN_MASK;
+-              store_u32((uint8_t *) level_buf->icf_buf_next, code);
++              store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
+               level_buf->icf_buf_next++;
+ 
+               level_buf->hist.ll_hist[lit_len]++;
+diff --git a/igzip/igzip_inflate.c b/igzip/igzip_inflate.c
+index 526c2eac..37649cd8 100644
+--- a/igzip/igzip_inflate.c
++++ b/igzip/igzip_inflate.c
+@@ -39,19 +39,6 @@
+ #include "static_inflate.h"
+ #endif
+ 
+-#ifdef __FreeBSD__
+-#include <sys/types.h>
+-#include <sys/endian.h>
+-# define bswap_32(x) bswap32(x)
+-#elif defined (__APPLE__)
+-#include <libkern/OSByteOrder.h>
+-# define bswap_32(x) OSSwapInt32(x)
+-#elif defined (__GNUC__) && !defined (__MINGW32__)
+-# include <byteswap.h>
+-#elif defined _WIN64
+-# define bswap_32(x) _byteswap_ulong(x)
+-#endif
+-
+ extern int decode_huffman_code_block_stateless(struct inflate_state *, 
uint8_t * start_out);
+ extern struct isal_hufftables hufftables_default;     /* For known header 
detection */
+ 
+@@ -255,7 +242,7 @@ static void inline inflate_in_load(struct inflate_state 
*state, int min_required
+               /* If there is enough space to load a 64 bits, load the data 
and use
+                * that to fill read_in */
+               new_bytes = 8 - (state->read_in_length + 7) / 8;
+-              temp = load_u64(state->next_in);
++              temp = load_le_u64(state->next_in);
+ 
+               state->read_in |= temp << state->read_in_length;
+               state->next_in += new_bytes;
+@@ -948,7 +935,7 @@ static int header_matches_pregen(struct inflate_state 
*state)
+       /* Check if stashed read_in_bytes match header */
+       hdr = &(hufftables_default.deflate_hdr[0]);
+       bits_read_mask = (1ull << state->read_in_length) - 1;
+-      hdr_stash = (load_u64(hdr) >> bits_read_prior) & bits_read_mask;
++      hdr_stash = (load_le_u64(hdr) >> bits_read_prior) & bits_read_mask;
+       in_stash = state->read_in & bits_read_mask;
+ 
+       if (hdr_stash != in_stash)
+@@ -1200,7 +1187,7 @@ static uint16_t inline decode_next_header(struct 
inflate_state *state,
+       /* next_sym is a possible symbol decoded from next_bits. If bit 15 is 0,
+        * next_code is a symbol. Bits 9:0 represent the symbol, and bits 14:10
+        * represent the length of that symbols huffman code. If next_sym is not
+-       * a symbol, it provides a hint of where the large symbols containin
++       * a symbol, it provides a hint of where the large symbols containing
+        * this code are located. Note the hint is at largest the location the
+        * first actual symbol in the long code list.*/
+       next_sym = huff_code->short_code_lookup[next_bits];
+@@ -1574,6 +1561,7 @@ static int inline decode_literal_block(struct 
inflate_state *state)
+ {
+       uint32_t len = state->type0_block_len;
+       uint32_t bytes = state->read_in_length / 8;
++      uint64_t read_in;
+       /* If the block is uncompressed, perform a memcopy while
+        * updating state data */
+       state->block_state = state->bfinal ? ISAL_BLOCK_INPUT_DONE : 
ISAL_BLOCK_NEW_HDR;
+@@ -1588,8 +1576,9 @@ static int inline decode_literal_block(struct 
inflate_state *state)
+               state->block_state = ISAL_BLOCK_TYPE0;
+       }
+       if (state->read_in_length) {
++              read_in = to_le64(state->read_in);
+               if (len >= bytes) {
+-                      memcpy(state->next_out, &state->read_in, bytes);
++                      memcpy(state->next_out, &read_in, bytes);
+ 
+                       state->next_out += bytes;
+                       state->avail_out -= bytes;
+@@ -1602,7 +1591,7 @@ static int inline decode_literal_block(struct 
inflate_state *state)
+                       bytes = 0;
+ 
+               } else {
+-                      memcpy(state->next_out, &state->read_in, len);
++                      memcpy(state->next_out, &read_in, len);
+ 
+                       state->next_out += len;
+                       state->avail_out -= len;
+@@ -1946,8 +1935,8 @@ static int check_gzip_checksum(struct inflate_state 
*state)
+                       byte_count = state->read_in_length / 8;
+                       offset = state->read_in_length % 8;
+ 
+-                      store_u64(state->tmp_in_buffer + tmp_in_size,
+-                                state->read_in >> offset);
++                      store_le_u64(state->tmp_in_buffer + tmp_in_size,
++                                   state->read_in >> offset);
+                       state->read_in = 0;
+                       state->read_in_length = 0;
+ 
+@@ -1961,7 +1950,7 @@ static int check_gzip_checksum(struct inflate_state 
*state)
+                       return ret;
+               }
+ 
+-              trailer = load_u64(next_in);
++              trailer = load_le_u64(next_in);
+       }
+ 
+       state->block_state = ISAL_BLOCK_FINISH;
+@@ -1997,8 +1986,8 @@ static int check_zlib_checksum(struct inflate_state 
*state)
+                       byte_count = state->read_in_length / 8;
+                       offset = state->read_in_length % 8;
+ 
+-                      store_u64(state->tmp_in_buffer + tmp_in_size,
+-                                state->read_in >> offset);
++                      store_le_u64(state->tmp_in_buffer + tmp_in_size,
++                                   state->read_in >> offset);
+                       state->read_in = 0;
+                       state->read_in_length = 0;
+ 
+@@ -2012,12 +2001,12 @@ static int check_zlib_checksum(struct inflate_state 
*state)
+                       return ret;
+               }
+ 
+-              trailer = load_u32(next_in);
++              trailer = load_le_u32(next_in);
+       }
+ 
+       state->block_state = ISAL_BLOCK_FINISH;
+ 
+-      if (bswap_32(trailer) != state->crc)
++      if (isal_bswap32(trailer) != state->crc)
+               return ISAL_INCORRECT_CHECKSUM;
+       else
+               return ISAL_DECOMP_OK;
+@@ -2051,7 +2040,7 @@ int isal_read_gzip_header(struct inflate_state *state, 
struct isal_gzip_header *
+               id2 = next_in[1];
+               cm = next_in[2];
+               flags = next_in[3];
+-              gz_hdr->time = load_u32(next_in + 4);
++              gz_hdr->time = load_le_u32(next_in + 4);
+               gz_hdr->xflags = *(next_in + 8);
+               gz_hdr->os = *(next_in + 9);
+ 
+@@ -2075,7 +2064,7 @@ int isal_read_gzip_header(struct inflate_state *state, 
struct isal_gzip_header *
+                               break;
+                       }
+ 
+-                      xlen = load_u16(next_in);
++                      xlen = load_le_u16(next_in);
+                       count = xlen;
+ 
+                       gz_hdr->extra_len = xlen;
+@@ -2130,7 +2119,7 @@ int isal_read_gzip_header(struct inflate_state *state, 
struct isal_gzip_header *
+                               return ret;
+                       }
+ 
+-                      if ((hcrc & 0xffff) != load_u16(next_in))
++                      if ((hcrc & 0xffff) != load_le_u16(next_in))
+                               return ISAL_INCORRECT_CHECKSUM;
+               }
+ 
+@@ -2181,7 +2170,7 @@ int isal_read_zlib_header(struct inflate_state *state, 
struct isal_zlib_header *
+                               break;
+                       }
+ 
+-                      zlib_hdr->dict_id = load_u32(next_in);
++                      zlib_hdr->dict_id = load_le_u32(next_in);
+               }
+ 
+               state->wrapper_flag = 1;
+@@ -2370,7 +2359,7 @@ int isal_inflate(struct inflate_state *state)
+ 
+                       /* Copy valid data from internal buffer into out_buffer 
*/
+                       if (state->write_overflow_len != 0) {
+-                              store_u32(state->next_out, 
state->write_overflow_lits);
++                              store_le_u32(state->next_out, 
state->write_overflow_lits);
+                               state->next_out += state->write_overflow_len;
+                               state->total_out += state->write_overflow_len;
+                               state->write_overflow_lits = 0;
+@@ -2468,8 +2457,8 @@ int isal_inflate(struct inflate_state *state)
+ 
+               /* Write overflow data into tmp buffer */
+               if (state->write_overflow_len != 0) {
+-                      store_u32(&state->tmp_out_buffer[state->tmp_out_valid],
+-                                state->write_overflow_lits);
++                      
store_le_u32(&state->tmp_out_buffer[state->tmp_out_valid],
++                                   state->write_overflow_lits);
+                       state->tmp_out_valid += state->write_overflow_len;
+                       state->total_out += state->write_overflow_len;
+                       state->write_overflow_lits = 0;
+diff --git a/igzip/igzip_rand_test.c b/igzip/igzip_rand_test.c
+index 74195d64..cd90dad6 100644
+--- a/igzip/igzip_rand_test.c
++++ b/igzip/igzip_rand_test.c
+@@ -546,7 +546,7 @@ int inflate_stateless_pass(uint8_t * compress_buf, 
uint64_t compress_len,
+ 
+                       if (!ret)
+                               ret =
+-                                  check_gzip_trl(load_u64(state.next_in - 
offset),
++                                  check_gzip_trl(load_le_u64(state.next_in - 
offset),
+                                                  state.crc, uncompress_buf, 
*uncompress_len);
+                       else if (ret == ISAL_INCORRECT_CHECKSUM)
+                               ret = INCORRECT_GZIP_TRAILER;
+@@ -558,7 +558,7 @@ int inflate_stateless_pass(uint8_t * compress_buf, 
uint64_t compress_len,
+ 
+                       if (!ret)
+                               ret =
+-                                  check_zlib_trl(load_u32(state.next_in - 
offset),
++                                  check_zlib_trl(load_le_u32(state.next_in - 
offset),
+                                                  state.crc, uncompress_buf, 
*uncompress_len);
+                       else if (ret == ISAL_INCORRECT_CHECKSUM)
+                               ret = INCORRECT_ZLIB_TRAILER;
+@@ -743,6 +743,7 @@ int inflate_multi_pass(uint8_t * compress_buf, uint64_t 
compress_len,
+                                       printf("Failed to allocate memory\n");
+                                       return MALLOC_FAILED;
+                               }
++                              memset(uncomp_tmp, 0, uncomp_tmp_size);
+ 
+                               state->avail_out = uncomp_tmp_size;
+                               state->next_out = uncomp_tmp;
+@@ -802,7 +803,7 @@ int inflate_multi_pass(uint8_t * compress_buf, uint64_t 
compress_len,
+                                   || gzip_flag == IGZIP_GZIP)
+                                       compress_len -= gzip_trl_bytes;
+                               ret =
+-                                  check_gzip_trl(load_u64(compress_buf + 
compress_len),
++                                  check_gzip_trl(load_le_u64(compress_buf + 
compress_len),
+                                                  state->crc, uncompress_buf,
+                                                  *uncompress_len);
+                       } else if (gzip_flag == IGZIP_ZLIB_NO_HDR) {
+@@ -810,7 +811,7 @@ int inflate_multi_pass(uint8_t * compress_buf, uint64_t 
compress_len,
+                                   || gzip_flag == ISAL_ZLIB_NO_HDR_VER)
+                                       compress_len -= zlib_trl_bytes;
+                               ret =
+-                                  check_zlib_trl(load_u32(compress_buf + 
compress_len),
++                                  check_zlib_trl(load_le_u32(compress_buf + 
compress_len),
+                                                  state->crc, uncompress_buf,
+                                                  *uncompress_len);
+                       }
+@@ -1152,6 +1153,7 @@ int compress_multi_pass(uint8_t * data, uint32_t 
data_size, uint8_t * compressed
+               if (rand() % 2 == 0)
+                       isal_deflate_set_dict(stream, dict, dict_len);
+               else {
++                      memset(&dict_str, 0, sizeof(dict_str));
+                       isal_deflate_process_dict(stream, &dict_str, dict, 
dict_len);
+                       isal_deflate_reset_dict(stream, &dict_str);
+               }
+@@ -1347,6 +1349,7 @@ int compress_single_pass(uint8_t * data, uint32_t 
data_size, uint8_t * compresse
+               if (rand() % 2 == 0)
+                       isal_deflate_set_dict(&stream, dict, dict_len);
+               else {
++                      memset(&dict_str, 0, sizeof(dict_str));
+                       isal_deflate_process_dict(&stream, &dict_str, dict, 
dict_len);
+                       isal_deflate_reset_dict(&stream, &dict_str);
+               }
+diff --git a/igzip/proc_heap_base.c b/igzip/proc_heap_base.c
+index 777bd0f0..271a5f62 100644
+--- a/igzip/proc_heap_base.c
++++ b/igzip/proc_heap_base.c
+@@ -74,12 +74,12 @@ uint32_t build_huff_tree(struct heap_tree *heap_space, 
uint64_t heap_size, uint6
+ 
+               heapify(heap, heap_size, 1);
+ 
+-              store_u16((uint8_t *) & heap[node_ptr], h1);
+-              store_u16((uint8_t *) & heap[node_ptr - 1], h2);
++              store_native_u16_to_u64(&heap[node_ptr], h1);
++              store_native_u16_to_u64(&heap[node_ptr - 1], h2);
+               node_ptr -= 2;
+ 
+       }
+       h1 = heap[1];
+-      store_u16((uint8_t *) & heap[node_ptr], h1);
++      store_native_u16_to_u64(&heap[node_ptr], h1);
+       return node_ptr;
+ }
+diff --git a/include/unaligned.h b/include/unaligned.h
+index f7b1ed88..002cb32e 100644
+--- a/include/unaligned.h
++++ b/include/unaligned.h
+@@ -31,46 +31,174 @@
+ #define UNALIGNED_H
+ 
+ #include "stdint.h"
++#include "stdlib.h"
+ #include "string.h"
+ 
+-static inline uint16_t load_u16(uint8_t * buf) {
++#ifdef __FreeBSD__
++#include <sys/types.h>
++#include <sys/endian.h>
++# define isal_bswap16(x) bswap16(x)
++# define isal_bswap32(x) bswap32(x)
++# define isal_bswap64(x) bswap64(x)
++#elif defined (__APPLE__)
++#include <libkern/OSByteOrder.h>
++# define isal_bswap16(x) OSSwapInt16(x)
++# define isal_bswap32(x) OSSwapInt32(x)
++# define isal_bswap64(x) OSSwapInt64(x)
++#elif defined (__GNUC__) && !defined (__MINGW32__)
++# include <byteswap.h>
++# define isal_bswap16(x) bswap_16(x)
++# define isal_bswap32(x) bswap_32(x)
++# define isal_bswap64(x) bswap_64(x)
++#elif defined _WIN64
++# define isal_bswap16(x) _byteswap_ushort(x)
++# define isal_bswap32(x) _byteswap_ulong(x)
++# define isal_bswap64(x) _byteswap_uint64(x)
++#endif
++
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++# define to_be16(x) isal_bswap16(x)
++# define from_be16(x) isal_bswap16(x)
++# define to_be32(x) isal_bswap32(x)
++# define from_be32(x) isal_bswap32(x)
++# define to_be64(x) isal_bswap64(x)
++# define from_be64(x) isal_bswap64(x)
++# define to_le16(x) (x)
++# define from_le16(x) (x)
++# define to_le32(x) (x)
++# define from_le32(x) (x)
++# define to_le64(x) (x)
++# define from_le64(x) (x)
++#else
++# define to_be16(x) (x)
++# define from_be16(x) (x)
++# define to_be32(x) (x)
++# define from_be32(x) (x)
++# define to_be64(x) (x)
++# define from_be64(x) (x)
++# define to_le16(x) isal_bswap16(x)
++# define from_le16(x) isal_bswap16(x)
++# define to_le32(x) isal_bswap32(x)
++# define from_le32(x) isal_bswap32(x)
++# define to_le64(x) isal_bswap64(x)
++# define from_le64(x) isal_bswap64(x)
++#endif
++
++static inline uint16_t load_native_u16(uint8_t * buf)
++{
+       uint16_t ret;
+       memcpy(&ret, buf, sizeof(ret));
+       return ret;
+ }
+ 
+-static inline uint32_t load_u32(uint8_t * buf) {
++static inline uint16_t load_le_u16(uint8_t * buf)
++{
++      return from_le16(load_native_u16(buf));
++}
++
++static inline uint16_t load_be_u16(uint8_t * buf)
++{
++      return from_be16(load_native_u16(buf));
++}
++
++static inline uint32_t load_native_u32(uint8_t * buf)
++{
+       uint32_t ret;
+       memcpy(&ret, buf, sizeof(ret));
+       return ret;
+ }
+ 
+-static inline uint64_t load_u64(uint8_t * buf) {
++static inline uint32_t load_le_u32(uint8_t * buf)
++{
++      return from_le32(load_native_u32(buf));
++}
++
++static inline uint32_t load_be_u32(uint8_t * buf)
++{
++      return from_be32(load_native_u32(buf));
++}
++
++static inline uint64_t load_native_u64(uint8_t * buf)
++{
+       uint64_t ret;
+       memcpy(&ret, buf, sizeof(ret));
+       return ret;
+ }
+ 
+-static inline uintmax_t load_umax(uint8_t * buf) {
+-      uintmax_t ret;
+-      memcpy(&ret, buf, sizeof(ret));
+-      return ret;
++static inline uint64_t load_le_u64(uint8_t * buf)
++{
++      return from_le64(load_native_u64(buf));
+ }
+ 
+-static inline void store_u16(uint8_t * buf, uint16_t val) {
+-      memcpy(buf, &val, sizeof(val));
++static inline uint64_t load_be_u64(uint8_t * buf)
++{
++      return from_be64(load_native_u64(buf));
++}
++
++static inline uintmax_t load_le_umax(uint8_t * buf)
++{
++      switch (sizeof(uintmax_t)) {
++      case sizeof(uint32_t):
++              return from_le32(load_native_u32(buf));
++      case sizeof(uint64_t):
++              return from_le64(load_native_u64(buf));
++      default:
++              return 0;
++      }
+ }
+ 
+-static inline void store_u32(uint8_t * buf, uint32_t val) {
++static inline void store_native_u16(uint8_t * buf, uint16_t val)
++{
+       memcpy(buf, &val, sizeof(val));
+ }
+ 
+-static inline void store_u64(uint8_t * buf, uint64_t val) {
++static inline void store_le_u16(uint8_t * buf, uint16_t val)
++{
++      store_native_u16(buf, to_le16(val));
++}
++
++static inline void store_be_u16(uint8_t * buf, uint16_t val)
++{
++      store_native_u16(buf, to_be16(val));
++}
++
++static inline void store_native_u16_to_u64(uint64_t * buf, uint16_t val)
++{
++#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
++      store_native_u16((uint8_t *) buf, val);
++#else
++      store_native_u16((uint8_t *) buf + 6, val);
++#endif
++}
++
++static inline void store_native_u32(uint8_t * buf, uint32_t val)
++{
+       memcpy(buf, &val, sizeof(val));
+ }
+ 
+-static inline void store_umax(uint8_t * buf, uintmax_t val) {
++static inline void store_le_u32(uint8_t * buf, uint32_t val)
++{
++      store_native_u32(buf, to_le32(val));
++}
++
++static inline void store_be_u32(uint8_t * buf, uint32_t val)
++{
++      store_native_u32(buf, to_be32(val));
++}
++
++static inline void store_native_u64(uint8_t * buf, uint64_t val)
++{
+       memcpy(buf, &val, sizeof(val));
+ }
+ 
++static inline void store_le_u64(uint8_t * buf, uint64_t val)
++{
++      store_native_u64(buf, to_le64(val));
++}
++
++static inline void store_be_u64(uint8_t * buf, uint64_t val)
++{
++      store_native_u64(buf, to_be64(val));
++}
++
+ #endif
+diff --git a/mem/mem_zero_detect_base.c b/mem/mem_zero_detect_base.c
+index 23530165..23c73489 100644
+--- a/mem/mem_zero_detect_base.c
++++ b/mem/mem_zero_detect_base.c
+@@ -39,7 +39,7 @@ int mem_zero_detect_base(void *buf, size_t n)
+       // Check buffer in native machine width comparisons
+       while (n >= sizeof(uintmax_t)) {
+               n -= sizeof(uintmax_t);
+-              if (load_umax(c) != 0)
++              if (load_le_umax(c) != 0)
+                       return -1;
+               c += sizeof(uintmax_t);
+       }
+@@ -53,12 +53,12 @@ int mem_zero_detect_base(void *buf, size_t n)
+       case 5:
+               a |= *c++;      // fall through to case 4
+       case 4:
+-              a |= load_u32(c);
++              a |= load_le_u32(c);
+               break;
+       case 3:
+               a |= *c++;      // fall through to case 2
+       case 2:
+-              a |= load_u16(c);
++              a |= load_le_u16(c);
+               break;
+       case 1:
+               a |= *c;
+diff --git a/tests/fuzz/igzip_simple_round_trip_fuzz_test.c 
b/tests/fuzz/igzip_simple_round_trip_fuzz_test.c
+index 38196915..83a7a885 100644
+--- a/tests/fuzz/igzip_simple_round_trip_fuzz_test.c
++++ b/tests/fuzz/igzip_simple_round_trip_fuzz_test.c
+@@ -118,9 +118,9 @@ int LLVMFuzzerTestOneInput(const uint8_t * data, size_t 
size)
+       int trailer_idx = cstate.total_out - trailer_size[wrapper_type];
+ 
+       if (wrapper_type == IGZIP_GZIP || wrapper_type == IGZIP_GZIP_NO_HDR)
+-              crc = load_u32(&isal_cmp_buf[trailer_idx]);
++              crc = load_le_u32(&isal_cmp_buf[trailer_idx]);
+       else if (wrapper_type == IGZIP_ZLIB || wrapper_type == 
IGZIP_ZLIB_NO_HDR)
+-              crc = bswap_32(load_u32(&isal_cmp_buf[trailer_idx]));
++              crc = load_be_u32(&isal_cmp_buf[trailer_idx]);
+ 
+       assert(istate.crc == crc);
+       free(isal_cmp_buf);
diff -Nru libisal-2.30.0/debian/patches/series 
libisal-2.30.0/debian/patches/series
--- libisal-2.30.0/debian/patches/series        1970-01-01 01:00:00.000000000 
+0100
+++ libisal-2.30.0/debian/patches/series        2022-06-02 14:05:49.000000000 
+0200
@@ -0,0 +1 @@
+s390x-compat.patch

Reply via email to