From bff86810a5bbd1cd823463d1b0b165f7debcde8f Mon Sep 17 00:00:00 2001 From: Pete Zaitcev Date: Sep 12 2018 04:57:25 +0000 Subject: Guard against linking with wrong CRC32 This became surprisingly involved, because first the patch required another (applied before), and second we needed a fixup to run checks on big-endian (applied after). And of course we now depend on zlib. --- diff --git a/liberasurecode-1.5.0-c601679-2.patch b/liberasurecode-1.5.0-c601679-2.patch new file mode 100644 index 0000000..907546c --- /dev/null +++ b/liberasurecode-1.5.0-c601679-2.patch @@ -0,0 +1,236 @@ +Adapted from: + +commit 7b547e0e46fc0a4172b602ec2a362eb1fa3a6431 +Author: Tim Burke +Date: Tue Sep 11 19:36:10 2018 +0000 + + Allow reading of little-endian frags on big-endian + + ... and vice-versa. We'll fix up frag header values for our output + parameter from liberasurecode_get_fragment_metadata but otherwise + avoid manipulating the in-memory fragment much. + + Change-Id: Idd6833bdea60e27c9a0148ee28b4a2c1070be148 + +diff --git a/include/erasurecode/erasurecode_helpers.h b/include/erasurecode/erasurecode_helpers.h +index f0be41a..0168a55 100644 +--- a/include/erasurecode/erasurecode_helpers.h ++++ b/include/erasurecode/erasurecode_helpers.h +@@ -93,5 +93,21 @@ void *get_aligned_buffer16(int size); + + /* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */ + ++#ifndef bswap_32 ++static __inline uint32_t __libec_bswap_32(uint32_t __x) ++{ ++ return __x>>24 | (__x>>8&0xff00) | (__x<<8&0xff0000) | __x<<24; ++} ++#define bswap_32(x) __libec_bswap_32(x) ++#endif ++ ++#ifndef bswap_64 ++static __inline uint64_t __libec_bswap_64(uint64_t __x) ++{ ++ return (__libec_bswap_32(__x)+0ULL)<<32 | __libec_bswap_32(__x>>32); ++} ++#define bswap_64(x) __libec_bswap_64(x) ++#endif ++ + #endif // _ERASURECODE_HELPERS_H_ + +diff --git a/src/erasurecode.c b/src/erasurecode.c +--- a/src/erasurecode.c 2018-09-11 23:06:38.927333422 -0500 ++++ b/src/erasurecode.c 2018-09-11 23:01:02.134698955 -0500 +@@ -1053,17 +1055,36 @@ int liberasurecode_get_fragment_metadata + memcpy(fragment_metadata, fragment, sizeof(struct fragment_metadata)); + fragment_hdr = (fragment_header_t *) fragment; + if (LIBERASURECODE_FRAG_HEADER_MAGIC != fragment_hdr->magic) { +- log_error("Invalid fragment, illegal magic value"); +- ret = -EINVALIDPARAMS; +- goto out; ++ if (LIBERASURECODE_FRAG_HEADER_MAGIC != bswap_32(fragment_hdr->magic)) { ++ log_error("Invalid fragment, illegal magic value"); ++ ret = -EINVALIDPARAMS; ++ goto out; ++ } else { ++ // Must've written this on an opposite-endian architecture. ++ // Fix it in fragment_metadata ++ fragment_metadata->idx = bswap_32(fragment_metadata->idx); ++ fragment_metadata->size = bswap_32(fragment_metadata->size); ++ fragment_metadata->frag_backend_metadata_size = ++ bswap_32(fragment_metadata->frag_backend_metadata_size); ++ fragment_metadata->orig_data_size = ++ bswap_64(fragment_metadata->orig_data_size); ++ fragment_metadata->chksum_type = ++ bswap_32(fragment_metadata->chksum_type); ++ for (int i = 0; i < LIBERASURECODE_MAX_CHECKSUM_LEN; i++) { ++ fragment_metadata->chksum[i] = ++ bswap_32(fragment_metadata->chksum[i]); ++ } ++ fragment_metadata->backend_version = ++ bswap_32(fragment_metadata->backend_version); ++ } + } + +- switch(fragment_hdr->meta.chksum_type) { ++ switch(fragment_metadata->chksum_type) { + case CHKSUM_CRC32: { + uint32_t computed_chksum = 0; +- uint32_t stored_chksum = fragment_hdr->meta.chksum[0]; ++ uint32_t stored_chksum = fragment_metadata->chksum[0]; + char *fragment_data = get_data_ptr_from_fragment(fragment); +- uint64_t fragment_size = fragment_hdr->meta.size; ++ uint64_t fragment_size = fragment_metadata->size; + computed_chksum = crc32(0, (unsigned char *) fragment_data, fragment_size); + if (stored_chksum != computed_chksum) { + // Try again with our "alternative" crc32; see +@@ -1112,25 +1114,39 @@ + + int is_invalid_fragment_header(fragment_header_t *header) + { +- uint32_t *stored_csum = NULL, csum = 0; ++ uint32_t csum = 0, metadata_chksum = 0, libec_version = 0; + assert (NULL != header); + if (header->libec_version == 0) + /* libec_version must be bigger than 0 */ + return 1; +- if (header->libec_version < _VERSION(1,2,0)) ++ metadata_chksum = header->metadata_chksum; ++ libec_version = header->libec_version; ++ if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) { ++ if (bswap_32(header->magic) != LIBERASURECODE_FRAG_HEADER_MAGIC) { ++ log_error("Invalid fragment header (get meta chksum)!"); ++ return 1; ++ } else { ++ // Must've written this on an opposite-endian architecture. ++ // Fix our reference checksum and version, but *don't touch ++ // the header data yet*. Leave that for when we're extracting ++ // in liberasurecode_get_fragment_metadata ++ metadata_chksum = bswap_32(metadata_chksum); ++ libec_version = bswap_32(libec_version); ++ } ++ } ++ ++ if (libec_version < _VERSION(1,2,0)) + /* no metadata checksum support */ + return 0; +- stored_csum = get_metadata_chksum((char *) header); +- if (NULL == stored_csum) +- return 1; /* can't verify, possibly crc32 call error */ ++ + csum = crc32(0, (unsigned char *) &header->meta, sizeof(fragment_metadata_t)); +- if (*stored_csum == csum) { ++ if (metadata_chksum == csum) { + return 0; + } + // Else, try again with our "alternative" crc32; see + // https://bugs.launchpad.net/liberasurecode/+bug/1666320 + csum = liberasurecode_crc32_alt(0, &header->meta, sizeof(fragment_metadata_t)); +- return (*stored_csum != csum); ++ return (metadata_chksum != csum); + } + + int liberasurecode_verify_fragment_metadata(ec_backend_t be, +diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c +index a7bb612..d3ca200 100644 +--- a/test/liberasurecode_test.c ++++ b/test/liberasurecode_test.c +@@ -1762,29 +1762,77 @@ static void test_verify_stripe_metadata_frag_idx_invalid( + verify_fragment_metadata_mismatch_impl(be_id, args, FRAGIDX_OUT_OF_RANGE); + } + +-static void test_metadata_crcs() ++static void test_metadata_crcs_le() + { + // We've observed headers like this in the wild, using our busted crc32 +- char header[] = ++ char orig_header[] = + "\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x10\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x07\x01\x0e\x02\x00\xcc\x5e\x0c\x0b\x00" + "\x04\x01\x00\x22\xee\x45\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00"; ++ char header[sizeof(orig_header)]; ++ memcpy(header, orig_header, sizeof(orig_header)); + + fragment_metadata_t res; + + assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ assert(res.backend_version == _VERSION(2, 14, 1)); + assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); + + // Switch it to zlib's implementation +- header[70] = '\x18'; +- header[69] = '\x73'; +- header[68] = '\xf8'; +- header[67] = '\xec'; ++ orig_header[70] = '\x18'; ++ orig_header[69] = '\x73'; ++ orig_header[68] = '\xf8'; ++ orig_header[67] = '\xec'; ++ memcpy(header, orig_header, sizeof(orig_header)); + + assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ assert(res.backend_version == _VERSION(2, 14, 1)); + assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ ++ // Write down the wrong thing ++ header[70] = '\xff'; ++ assert(liberasurecode_get_fragment_metadata(header, &res) == -EBADHEADER); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 1); ++} ++ ++static void test_metadata_crcs_be() ++{ ++ // Like above, but big-endian ++ char orig_header[] = ++ "\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ++ "\x00\x10\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ++ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ++ "\x00\x00\x00\x00\x00\x00\x07\x00\x02\x0e\x01\x0b\x0c\x5e\xcc\x00" ++ "\x01\x04\x00\xfa\x85\x40\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00"; ++ char header[sizeof(orig_header)]; ++ memcpy(header, orig_header, sizeof(orig_header)); ++ ++ fragment_metadata_t res; ++ ++ assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ assert(res.backend_version == _VERSION(2, 14, 1)); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ ++ // Switch it to zlib's implementation ++ orig_header[67] = '\xe3'; ++ orig_header[68] = '\x73'; ++ orig_header[69] = '\x88'; ++ orig_header[70] = '\xa0'; ++ memcpy(header, orig_header, sizeof(orig_header)); ++ ++ assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); ++ assert(res.backend_version == _VERSION(2, 14, 1)); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ assert(memcmp(header, orig_header, sizeof(orig_header)) == 0); + + // Write down the wrong thing + header[70] = '\xff'; +@@ -1883,8 +1883,12 @@ + test_liberasurecode_get_version, + EC_BACKENDS_MAX, CHKSUM_TYPES_MAX, + .skip = false}, +- {"test_metadata_crcs", +- test_metadata_crcs, ++ {"test_metadata_crcs_le", ++ test_metadata_crcs_le, ++ EC_BACKENDS_MAX, 0, ++ .skip = false}, ++ {"test_metadata_crcs_be", ++ test_metadata_crcs_be, + EC_BACKENDS_MAX, 0, + .skip = false}, + // NULL backend test diff --git a/liberasurecode-1.5.0-nosse.patch b/liberasurecode-1.5.0-nosse.patch new file mode 100644 index 0000000..9efeede --- /dev/null +++ b/liberasurecode-1.5.0-nosse.patch @@ -0,0 +1,64 @@ +commit 9b4d8bcf8dc97d7edad3dc1443b317ecb5a0a254 +Author: Tim Burke +Date: Thu Jul 6 00:08:45 2017 +0000 + + Stop pretending to support SSE4-optimized CRC-32C + + It isn't the CRC we want, and we never used it anyway. While we may + define INTEL_SSE41 or INTEL_SSE42 if CPU seems to support it, we've + never defined INTEL_SSE4. + + Change-Id: I04e1dd6458ccde58a0a2f3f4d6947569a31e9697 + Partial-Bug: 1666320 + +diff --git a/src/utils/chksum/crc32.c b/src/utils/chksum/crc32.c +index 6710dd7..6bc844d 100644 +--- a/src/utils/chksum/crc32.c ++++ b/src/utils/chksum/crc32.c +@@ -42,30 +42,6 @@ + + #include + +-#if defined(INTEL_SSE4) +-#include +- +-int +-crc32(int crc, const void *buf, size_t size) +-{ +- unsigned long long *current = (unsigned long long*)buf; +- unsigned char *current_char; +- +- crc = crc ^ ~0U; +- +- while(size >= 8) { +- crc = _mm_crc32_u64(crc, *current++); +- size -= 8; +- } +- +- current_char = (unsigned char*)current; +- while (size--) { +- crc = _mm_crc32_u8(crc, *current_char++); +- } +- return crc ^ ~0U; +-} +-#else +- + static int crc32_tab[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, +@@ -112,9 +88,6 @@ static int crc32_tab[] = { + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + }; + +-// Use same polynomial as Intel's SSE4 instruction! +-#define POLY_CRC_32 0x11EDC6F41 +- + int + crc32(int crc, const void *buf, size_t size) + { +@@ -128,5 +101,3 @@ crc32(int crc, const void *buf, size_t size) + + return crc ^ ~0U; + } +-#endif +- diff --git a/liberasurecode-1.5.0-zlib.patch b/liberasurecode-1.5.0-zlib.patch new file mode 100644 index 0000000..15ad852 --- /dev/null +++ b/liberasurecode-1.5.0-zlib.patch @@ -0,0 +1,248 @@ +commit a9b20ae6a38073afe91ae2b7d789ddfb7dabade8 +Author: Tim Burke +Date: Thu Jul 6 00:21:01 2017 +0000 + + Use zlib for CRC-32 + + Previously, we had our own CRC that was almost but not quite like + zlib's implementation. However, + + * it hasn't been subjected to the same rigor with regard to error-detection + properties and + * it may not even get used, depending upon whether zlib happens to get + loaded before or after liberasurecode. + + Now, we'll use zlib's CRC-32 when writing new frags, while still + tolerating frags that were created with the old implementation. + + Change-Id: Ib5ea2a830c7c23d66bf2ca404a3eb84ad00c5bc5 + Closes-Bug: 1666320 + +diff --git a/bindep.txt b/bindep.txt +index aaef309..7593290 100644 +--- a/bindep.txt ++++ b/bindep.txt +@@ -1,6 +1,9 @@ + # This is a cross-platform list tracking distribution packages needed by tests; + # see http://docs.openstack.org/infra/bindep/ for additional information. + ++zlib1g-dev [platform:dpkg] ++zlib-devel [platform:rpm] ++ + build-essential [platform:dpkg] + gcc [platform:rpm] + make [platform:rpm] +diff --git a/erasurecode.pc.in b/erasurecode.pc.in +index ee6d82b..175367c 100644 +--- a/erasurecode.pc.in ++++ b/erasurecode.pc.in +@@ -11,5 +11,5 @@ Version: @LIBERASURECODE_VERSION@ + Requires: + Conflicts: + Libs: -L${libdir} -lerasurecode +-Libs.private: @ERASURECODE_STATIC_LIBS@ ++Libs.private: @ERASURECODE_STATIC_LIBS@ -lz + Cflags: -I${includedir}/ -I${includedir}/liberasurecode +diff --git a/include/erasurecode/alg_sig.h b/include/erasurecode/alg_sig.h +index 52554a9..e250fb3 100644 +--- a/include/erasurecode/alg_sig.h ++++ b/include/erasurecode/alg_sig.h +@@ -57,8 +57,7 @@ alg_sig_t *init_alg_sig(int sig_len, int gf_w); + void destroy_alg_sig(alg_sig_t* alg_sig_handle); + + int compute_alg_sig(alg_sig_t* alg_sig_handle, char *buf, int len, char *sig); +-int crc32_build_fast_table(); +-int crc32(int crc, const void *buf, int size); ++int liberasurecode_crc32_alt(int crc, const void *buf, int size); + + #endif + +diff --git a/src/Makefile.am b/src/Makefile.am +index 8312dd0..693809e 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -34,9 +34,10 @@ liberasurecode_la_SOURCES = \ + + liberasurecode_la_CPPFLAGS = -Werror @GCOV_FLAGS@ + liberasurecode_la_LIBADD = \ +- builtin/null_code/libnullcode.la -lpthread -lm @GCOV_LDFLAGS@ \ +- builtin/xor_codes/libXorcode.la -lpthread -lm @GCOV_LDFLAGS@ \ +- builtin/rs_vand/liberasurecode_rs_vand.la -lpthread -lm @GCOV_LDFLAGS@ ++ builtin/null_code/libnullcode.la \ ++ builtin/xor_codes/libXorcode.la \ ++ builtin/rs_vand/liberasurecode_rs_vand.la \ ++ -lpthread -lm -lz @GCOV_LDFLAGS@ + + # Version format (C - A).(A).(R) for C:R:A input + liberasurecode_la_LDFLAGS = -rpath '$(libdir)' -version-info @LIBERASURECODE_VERSION_INFO@ +diff --git a/src/erasurecode.c b/src/erasurecode.c +index d4a06c2..20da457 100644 +--- a/src/erasurecode.c ++++ b/src/erasurecode.c +@@ -26,6 +26,7 @@ + * vi: set noai tw=79 ts=4 sw=4: + */ + ++#include + #include "assert.h" + #include "list.h" + #include "erasurecode.h" +@@ -1063,9 +1064,17 @@ int liberasurecode_get_fragment_metadata(char *fragment, + uint32_t stored_chksum = fragment_hdr->meta.chksum[0]; + char *fragment_data = get_data_ptr_from_fragment(fragment); + uint64_t fragment_size = fragment_hdr->meta.size; +- computed_chksum = crc32(0, fragment_data, fragment_size); ++ computed_chksum = crc32(0, (unsigned char *) fragment_data, fragment_size); + if (stored_chksum != computed_chksum) { +- fragment_metadata->chksum_mismatch = 1; ++ // Try again with our "alternative" crc32; see ++ // https://bugs.launchpad.net/liberasurecode/+bug/1666320 ++ computed_chksum = liberasurecode_crc32_alt( ++ 0, fragment_data, fragment_size); ++ if (stored_chksum != computed_chksum) { ++ fragment_metadata->chksum_mismatch = 1; ++ } else { ++ fragment_metadata->chksum_mismatch = 0; ++ } + } else { + fragment_metadata->chksum_mismatch = 0; + } +@@ -1095,7 +1104,13 @@ int is_invalid_fragment_header(fragment_header_t *header) + stored_csum = get_metadata_chksum((char *) header); + if (NULL == stored_csum) + return 1; /* can't verify, possibly crc32 call error */ +- csum = crc32(0, &header->meta, sizeof(fragment_metadata_t)); ++ csum = crc32(0, (unsigned char *) &header->meta, sizeof(fragment_metadata_t)); ++ if (*stored_csum == csum) { ++ return 0; ++ } ++ // Else, try again with our "alternative" crc32; see ++ // https://bugs.launchpad.net/liberasurecode/+bug/1666320 ++ csum = liberasurecode_crc32_alt(0, &header->meta, sizeof(fragment_metadata_t)); + return (*stored_csum != csum); + } + +diff --git a/src/erasurecode_helpers.c b/src/erasurecode_helpers.c +index fd14298..4a49786 100644 +--- a/src/erasurecode_helpers.c ++++ b/src/erasurecode_helpers.c +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + #include "erasurecode_backend.h" + #include "erasurecode_helpers.h" + #include "erasurecode_helpers_ext.h" +@@ -474,7 +475,7 @@ inline int set_checksum(ec_checksum_type_t ct, char *buf, int blocksize) + + switch(header->meta.chksum_type) { + case CHKSUM_CRC32: +- header->meta.chksum[0] = crc32(0, data, blocksize); ++ header->meta.chksum[0] = crc32(0, (unsigned char *) data, blocksize); + break; + case CHKSUM_MD5: + break; +@@ -512,7 +513,7 @@ inline int set_metadata_chksum(char *buf) + return -1; + } + +- header->metadata_chksum = crc32(0, &header->meta, ++ header->metadata_chksum = crc32(0, (unsigned char *) &header->meta, + sizeof(fragment_metadata_t)); + return 0; + } +diff --git a/src/utils/chksum/crc32.c b/src/utils/chksum/crc32.c +index 6bc844d..b11dec9 100644 +--- a/src/utils/chksum/crc32.c ++++ b/src/utils/chksum/crc32.c +@@ -89,7 +89,7 @@ static int crc32_tab[] = { + }; + + int +-crc32(int crc, const void *buf, size_t size) ++liberasurecode_crc32_alt(int crc, const void *buf, size_t size) + { + const char *p; + +diff --git a/test/Makefile.am b/test/Makefile.am +index d8ffa79..2e33bdc 100644 +--- a/test/Makefile.am ++++ b/test/Makefile.am +@@ -15,7 +15,7 @@ check_PROGRAMS += alg_sig_test + + liberasurecode_test_SOURCES = liberasurecode_test.c + liberasurecode_test_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/include/erasurecode @GCOV_FLAGS@ +-liberasurecode_test_LDFLAGS = @GCOV_LDFLAGS@ $(top_builddir)/src/liberasurecode.la -ldl -lpthread ++liberasurecode_test_LDFLAGS = @GCOV_LDFLAGS@ $(top_builddir)/src/liberasurecode.la -ldl -lpthread -lz + check_PROGRAMS += liberasurecode_test + + libec_slap_SOURCES = libec_slap.c +diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c +index 4791ca9..68c1c13 100644 +--- a/test/liberasurecode_test.c ++++ b/test/liberasurecode_test.c +@@ -28,6 +28,7 @@ + + #include + #include ++#include + #include "erasurecode.h" + #include "erasurecode_helpers.h" + #include "erasurecode_helpers_ext.h" +@@ -475,7 +476,7 @@ static void validate_fragment_checksum(struct ec_args *args, + assert(false); //currently only have support crc32 + break; + case CHKSUM_CRC32: +- computed = crc32(0, fragment_data, size); ++ computed = crc32(0, (unsigned char *) fragment_data, size); + break; + case CHKSUM_NONE: + assert(metadata->chksum_mismatch == 0); +@@ -1745,6 +1746,35 @@ static void test_verify_stripe_metadata_frag_idx_invalid( + verify_fragment_metadata_mismatch_impl(be_id, args, FRAGIDX_OUT_OF_RANGE); + } + ++static void test_metadata_crcs() ++{ ++ // We've observed headers like this in the wild, using our busted crc32 ++ char header[] = ++ "\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x10\x00" ++ "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ++ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ++ "\x00\x00\x00\x00\x00\x00\x07\x01\x0e\x02\x00\xcc\x5e\x0c\x0b\x00" ++ "\x04\x01\x00\x22\xee\x45\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00"; ++ ++ fragment_metadata_t res; ++ ++ assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ ++ // Switch it to zlib's implementation ++ header[70] = '\x18'; ++ header[69] = '\x73'; ++ header[68] = '\xf8'; ++ header[67] = '\xec'; ++ ++ assert(liberasurecode_get_fragment_metadata(header, &res) == 0); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 0); ++ ++ // Write down the wrong thing ++ header[70] = '\xff'; ++ assert(liberasurecode_get_fragment_metadata(header, &res) == -EBADHEADER); ++ assert(is_invalid_fragment_header((fragment_header_t *) header) == 1); ++} + + //static void test_verify_str + +@@ -1805,6 +1835,10 @@ struct testcase testcases[] = { + test_liberasurecode_get_version, + EC_BACKENDS_MAX, CHKSUM_TYPES_MAX, + .skip = false}, ++ {"test_metadata_crcs", ++ test_metadata_crcs, ++ EC_BACKENDS_MAX, 0, ++ .skip = false}, + // NULL backend test + {"create_and_destroy_backend", + test_create_and_destroy_backend, diff --git a/liberasurecode.spec b/liberasurecode.spec index cd84bef..9f6fcb6 100644 --- a/liberasurecode.spec +++ b/liberasurecode.spec @@ -1,6 +1,6 @@ Name: liberasurecode Version: 1.5.0 -Release: 6%{?dist} +Release: 8%{?dist} Summary: Erasure Code API library written in C with pluggable backends # Main license is a 2-clause BSD with clause numbers removed for some reason. @@ -13,6 +13,9 @@ URL: https://bitbucket.org/tsg-/liberasurecode/ Source0: %{name}-%{version}.tar.gz Patch2: liberasurecode-1.0.5-docs.patch Patch3: liberasurecode-1.5.0-ldtest.patch +Patch4: liberasurecode-1.5.0-nosse.patch +Patch5: liberasurecode-1.5.0-zlib.patch +Patch6: liberasurecode-1.5.0-c601679-2.patch BuildRequires: autoconf BuildRequires: automake @@ -23,6 +26,7 @@ BuildRequires: gcc BuildRequires: libtool BuildRequires: make BuildRequires: sed +BuildRequires: zlib-devel %description An API library for Erasure Code, written in C. It provides a number @@ -47,6 +51,9 @@ developing applications that use %{name}. %setup -q %patch2 -p1 %patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 %build autoreconf -i -v @@ -85,6 +92,10 @@ find $RPM_BUILD_ROOT%{_datadir}/doc -type f -exec chmod a-x {} ';' %changelog +* Tue Sep 11 2018 Pete Zaitcev 1.5.0-8 +- Ensure that we're using the correct checksum +- Get tests pass on s390x (a big-endian arch) + * Fri Jul 13 2018 Fedora Release Engineering - 1.5.0-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild