From fee0baebd523f58a90e2eb7d8c6314ed84f83c5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?=
Date: Fri, 18 Dec 2020 14:19:43 +0000
Subject: [PATCH] fix test failure on i686 and s390
https://github.com/facebook/zstd/pull/2432
---
alignment.patch | 44 ++++++++++++++++++++++++++++++++++++++++++++
zstd.spec | 2 ++
2 files changed, 46 insertions(+)
create mode 100644 alignment.patch
diff --git a/alignment.patch b/alignment.patch
new file mode 100644
index 0000000..39f5137
--- /dev/null
+++ b/alignment.patch
@@ -0,0 +1,44 @@
+From ae85676d44baee3d12168a5c929347b3836f2cf2 Mon Sep 17 00:00:00 2001
+From: Nick Terrell
+Date: Thu, 17 Dec 2020 14:27:53 -0800
+Subject: [PATCH] Fix alignment of scratchBuffer in HUF_compressWeights()
+
+The scratch buffer must be 4-byte aligned. This causes test failures in
+32-bit systems, where the stack isn't aligned.
+
+Fixes Issue #2428.
+---
+ lib/common/fse.h | 5 +++--
+ lib/compress/huf_compress.c | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/lib/common/fse.h b/lib/common/fse.h
+index 83a07847a..dd5fc44e8 100644
+--- a/lib/common/fse.h
++++ b/lib/common/fse.h
+@@ -335,9 +335,10 @@ size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
+
+ /* FSE_buildCTable_wksp() :
+ * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
+- * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog)`.
++ * `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`.
+ */
+-#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * (maxSymbolValue + 2) + (1ull << tableLog))
++#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (maxSymbolValue + 2 + (1ull << (tableLog - 2)))
++#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog))
+ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
+
+ #define FSE_BUILD_DTABLE_WKSP_SIZE(maxTableLog, maxSymbolValue) (sizeof(short) * (maxSymbolValue + 1) + (1ULL << maxTableLog) + 8)
+diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c
+index abbcc3192..00c593d7e 100644
+--- a/lib/compress/huf_compress.c
++++ b/lib/compress/huf_compress.c
+@@ -69,7 +69,7 @@ static size_t HUF_compressWeights (void* dst, size_t dstSize, const void* weight
+ U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER;
+
+ FSE_CTable CTable[FSE_CTABLE_SIZE_U32(MAX_FSE_TABLELOG_FOR_HUFF_HEADER, HUF_TABLELOG_MAX)];
+- BYTE scratchBuffer[FSE_BUILD_CTABLE_WORKSPACE_SIZE(HUF_TABLELOG_MAX, MAX_FSE_TABLELOG_FOR_HUFF_HEADER)];
++ U32 scratchBuffer[FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(HUF_TABLELOG_MAX, MAX_FSE_TABLELOG_FOR_HUFF_HEADER)];
+
+ unsigned count[HUF_TABLELOG_MAX+1];
+ S16 norm[HUF_TABLELOG_MAX+1];
diff --git a/zstd.spec b/zstd.spec
index 68c8f93..7e4fe7d 100644
--- a/zstd.spec
+++ b/zstd.spec
@@ -21,6 +21,7 @@ URL: https://github.com/facebook/zstd
Source0: https://github.com/facebook/zstd/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
Patch1: pzstd.1.patch
+Patch2: alignment.patch
BuildRequires: gcc gtest-devel
%if %{with pzstd}
@@ -57,6 +58,7 @@ find -name .gitignore -delete
%if %{with pzstd}
%patch1 -p1
%endif
+%patch2 -p1
%build
export CFLAGS="$RPM_OPT_FLAGS"