commit:     9d725033067c9777871074c849ca71708b9f6b10
Author:     David Seifert <soap <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 13 18:12:07 2022 +0000
Commit:     David Seifert <soap <AT> gentoo <DOT> org>
CommitDate: Wed Jul 13 18:12:07 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9d725033

app-arch/par2cmdline: backport upstream patch for big-endian archs

* upstream issue:
  https://github.com/Parchive/par2cmdline/issues/143

Closes: https://bugs.gentoo.org/856367
Signed-off-by: David Seifert <soap <AT> gentoo.org>

 .../files/par2cmdline-0.8.1-big-endian.patch       | 70 ++++++++++++++++++++++
 app-arch/par2cmdline/par2cmdline-0.8.1.ebuild      |  1 +
 2 files changed, 71 insertions(+)

diff --git a/app-arch/par2cmdline/files/par2cmdline-0.8.1-big-endian.patch 
b/app-arch/par2cmdline/files/par2cmdline-0.8.1-big-endian.patch
new file mode 100644
index 000000000000..e45f8f3235d1
--- /dev/null
+++ b/app-arch/par2cmdline/files/par2cmdline-0.8.1-big-endian.patch
@@ -0,0 +1,70 @@
+# backport upstream pr #144, fixes test failure on big endian archs;
+# see https://github.com/Parchive/par2cmdline/issues/143
+From 4f3576a314d7169912842ec9dc1e595e61e52653 Mon Sep 17 00:00:00 2001
+From: Michael Nahas <m...@nahas.com>
+Date: Tue, 11 Feb 2020 22:42:08 -0600
+Subject: [PATCH] Fix for Github issue #143.  Test did not account for
+ endianness correctly.
+
+---
+ src/reedsolomon_test.cpp | 30 +++++++++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+diff --git a/src/reedsolomon_test.cpp b/src/reedsolomon_test.cpp
+index 1285b3c..c8d26e9 100644
+--- a/src/reedsolomon_test.cpp
++++ b/src/reedsolomon_test.cpp
+@@ -433,6 +433,23 @@ int test3() {
+ 
+ 
+ // Check that the correct constants are being used for Par2
++
++//The test pretends there are 10 input blocks ("NUM_IN") and 1
++//recovery block ("NUM_REC"), each 1024 bytes long ("BUF_SIZE"). These
++//are all stored in data[11][BUF_SIZE], with the input blocks
++//occupying data[0] through data[9] and the recovery block in
++//data[10].
++
++//The test zeroes out the input blocks and then writes a 1 into the
++//first location of the first input block, and into the second
++//location of the second input block, etc. It then generates the
++//recovery block using many calls to ReedSolomon. When that happens,
++//those 1s are multiplied by the coefficients for each input block. So
++//the first location of recovery block holds the coefficient for the
++//first input block, the second location has the coefficient for the
++//second input block, etc. Those values are checked against the
++//expected values passed to the function.
++
+ template<typename gtype, typename utype>
+ int test4(int NUM_IN, int *expected_bases) {
+   //const int NUM_IN  = 10;
+@@ -448,8 +465,9 @@ int test4(int NUM_IN, int *expected_bases) {
+     for (int k = 0; k < BUF_SIZE; k++) {
+       data[i][k] = (u8)0;
+     }
+-    // EXCEPT put a 1 in a different place for each file
+-    ((gtype *)(&(data[i][0])))[i] = (utype) 1;
++    // EXCEPT write a (little endian) 1 in a different place for each file
++    // In the i-th file, it is written into the i-th location
++    data[i][sizeof(utype)*i] = (u8) 1;
+   }
+   // zero recovery
+   for (int j = 0; j < NUM_REC; j++) {
+@@ -488,7 +506,13 @@ int test4(int NUM_IN, int *expected_bases) {
+   // The recovery file has exponent 1 and should
+   // contain each base to the power 1.
+   for (int i = 0; i < NUM_IN; i++) {
+-    int base = (utype) ((gtype *) &(data[NUM_IN+0][0]))[i];
++    // read little-endian value
++    utype v = 0;
++    for (int byte_index = 0; byte_index < sizeof(utype); byte_index++) {
++      u8 byte = data[NUM_IN+0][sizeof(utype)*i + byte_index];
++      v |= (((utype)byte) << (byte_index*8));
++    }
++    int base = v;
+     if (base != expected_bases[i]) {
+       cerr << "base at location " << i << " did not match expected." << endl;
+       cerr << "   base     = " << base << endl;
+-- 
+2.17.1
+

diff --git a/app-arch/par2cmdline/par2cmdline-0.8.1.ebuild 
b/app-arch/par2cmdline/par2cmdline-0.8.1.ebuild
index e12295b12951..adeb06611a33 100644
--- a/app-arch/par2cmdline/par2cmdline-0.8.1.ebuild
+++ b/app-arch/par2cmdline/par2cmdline-0.8.1.ebuild
@@ -14,6 +14,7 @@ SLOT="0"
 KEYWORDS="amd64 ~arm ~hppa ~ppc ~ppc64 x86 ~amd64-linux ~x86-linux ~ppc-macos"
 IUSE="openmp"
 
+PATCHES=( "${FILESDIR}"/${P}-big-endian.patch )
 DOCS="AUTHORS ChangeLog README" # NEWS is empty, PORTING and ROADMAP are for 
building
 
 pkg_pretend() {

Reply via email to