diff --git a/base64.patch b/base64.patch new file mode 100644 index 0000000..1c725ca --- /dev/null +++ b/base64.patch @@ -0,0 +1,158 @@ +Index: cpprestsdk-2.10.16/Release/src/utilities/base64.cpp +=================================================================== +--- cpprestsdk-2.10.16.orig/Release/src/utilities/base64.cpp ++++ cpprestsdk-2.10.16/Release/src/utilities/base64.cpp +@@ -43,30 +43,6 @@ const std::array _ba + 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255}}; + +-struct _triple_byte +-{ +- unsigned char _1_1 : 2; +- unsigned char _0 : 6; +- unsigned char _2_1 : 4; +- unsigned char _1_2 : 4; +- unsigned char _3 : 6; +- unsigned char _2_2 : 2; +-}; +- +-struct _double_byte +-{ +- unsigned char _1_1 : 2; +- unsigned char _0 : 6; +- unsigned char _2_1 : 4; +- unsigned char _1_2 : 4; +-}; +- +-struct _single_byte +-{ +- unsigned char _1_1 : 2; +- unsigned char _0 : 6; +-}; +- + // + // A note on the implementation of BASE64 encoding and decoding: + // +@@ -134,26 +110,14 @@ std::vector _from_base64( + size_t idx = 0; + for (; size > 4; ++idx) + { +- unsigned char target[3]; +- memset(target, 0, sizeof(target)); +- _triple_byte* record = reinterpret_cast<_triple_byte*>(target); +- + unsigned char val0 = _base64_dectbl[ptr[0]]; + unsigned char val1 = _base64_dectbl[ptr[1]]; + unsigned char val2 = _base64_dectbl[ptr[2]]; + unsigned char val3 = _base64_dectbl[ptr[3]]; + +- record->_0 = val0; +- record->_1_1 = val1 >> 4; +- result[idx] = target[0]; +- +- record->_1_2 = val1 & 0xF; +- record->_2_1 = val2 >> 2; +- result[++idx] = target[1]; +- +- record->_2_2 = val2 & 0x3; +- record->_3 = val3 & 0x3F; +- result[++idx] = target[2]; ++ result[idx] = (val0 << 2) | (val1 >> 4); ++ result[++idx] = ((val1 & 0xF) << 4) | (val2 >> 2); ++ result[++idx] = ((val2 & 0x3) << 6) | (val3 & 0x3F); + + ptr += 4; + size -= 4; +@@ -163,45 +127,35 @@ std::vector _from_base64( + // in all the iterations (a performance issue). + + { +- unsigned char target[3]; +- memset(target, 0, sizeof(target)); +- _triple_byte* record = reinterpret_cast<_triple_byte*>(target); +- + unsigned char val0 = _base64_dectbl[ptr[0]]; + unsigned char val1 = _base64_dectbl[ptr[1]]; + unsigned char val2 = _base64_dectbl[ptr[2]]; + unsigned char val3 = _base64_dectbl[ptr[3]]; + +- record->_0 = val0; +- record->_1_1 = val1 >> 4; +- result[idx] = target[0]; ++ result[idx] = (val0 << 2) | (val1 >> 4); + +- record->_1_2 = val1 & 0xF; + if (val2 != 254) + { +- record->_2_1 = val2 >> 2; +- result[++idx] = target[1]; ++ result[++idx] = ((val1 & 0xF) << 4) | (val2 >> 2); + } + else + { + // There shouldn't be any information (ones) in the unused bits, +- if (record->_1_2 != 0) ++ if ((val1 & 0xF) != 0) + { + throw std::runtime_error("Invalid end of base64 string"); + } + return result; + } + +- record->_2_2 = val2 & 0x3; + if (val3 != 254) + { +- record->_3 = val3 & 0x3F; +- result[++idx] = target[2]; ++ result[++idx] = ((val2 & 0x3) << 6) | (val3 & 0x3F); + } + else + { + // There shouldn't be any information (ones) in the unused bits. +- if (record->_2_2 != 0) ++ if ((val2 & 0x3) != 0) + { + throw std::runtime_error("Invalid end of base64 string"); + } +@@ -218,11 +172,10 @@ utility::string_t _to_base64(const unsig + + for (; size >= 3;) + { +- const _triple_byte* record = reinterpret_cast(ptr); +- unsigned char idx0 = record->_0; +- unsigned char idx1 = (record->_1_1 << 4) | record->_1_2; +- unsigned char idx2 = (record->_2_1 << 2) | record->_2_2; +- unsigned char idx3 = record->_3; ++ unsigned char idx0 = ptr[0] >> 2; ++ unsigned char idx1 = ((ptr[0] & 0x3) << 4) | (ptr[1] >> 4); ++ unsigned char idx2 = ((ptr[1] & 0xF) << 2) | (ptr[2] >> 6); ++ unsigned char idx3 = ptr[2] & 0x3F; + result.push_back(char_t(_base64_enctbl[idx0])); + result.push_back(char_t(_base64_enctbl[idx1])); + result.push_back(char_t(_base64_enctbl[idx2])); +@@ -234,9 +187,8 @@ utility::string_t _to_base64(const unsig + { + case 1: + { +- const _single_byte* record = reinterpret_cast(ptr); +- unsigned char idx0 = record->_0; +- unsigned char idx1 = (record->_1_1 << 4); ++ unsigned char idx0 = ptr[0] >> 2; ++ unsigned char idx1 = ((ptr[0] & 0x3) << 4); + result.push_back(char_t(_base64_enctbl[idx0])); + result.push_back(char_t(_base64_enctbl[idx1])); + result.push_back('='); +@@ -245,10 +197,9 @@ utility::string_t _to_base64(const unsig + } + case 2: + { +- const _double_byte* record = reinterpret_cast(ptr); +- unsigned char idx0 = record->_0; +- unsigned char idx1 = (record->_1_1 << 4) | record->_1_2; +- unsigned char idx2 = (record->_2_1 << 2); ++ unsigned char idx0 = ptr[0] >> 2; ++ unsigned char idx1 = ((ptr[0] & 0x3) << 4) | (ptr[1] >> 4); ++ unsigned char idx2 = ((ptr[1] & 0xF) << 2); + result.push_back(char_t(_base64_enctbl[idx0])); + result.push_back(char_t(_base64_enctbl[idx1])); + result.push_back(char_t(_base64_enctbl[idx2])); diff --git a/cpprest-2.10.9-disable-test-extract_floating_point.patch b/cpprest-2.10.9-disable-test-extract_floating_point.patch index f36923c..32c701b 100644 --- a/cpprest-2.10.9-disable-test-extract_floating_point.patch +++ b/cpprest-2.10.9-disable-test-extract_floating_point.patch @@ -1,20 +1,13 @@ -diff --git a/Release/tests/functional/streams/istream_tests.cpp b/Release/tests/functional/streams/istream_tests.cpp -index d1018e31..66b3f801 100644 ---- a/Release/tests/functional/streams/istream_tests.cpp -+++ b/Release/tests/functional/streams/istream_tests.cpp -@@ -1297,6 +1297,7 @@ SUITE(istream_tests) - void compare_double(double expected, double actual) { compare_floating(expected, actual, DBL_EPSILON); } - void compare_float(float expected, float actual) { compare_floating(expected, actual, FLT_EPSILON); } - -+/* - TEST(extract_floating_point) - { - std::string test_string; -@@ -1343,6 +1344,7 @@ SUITE(istream_tests) - if (expected == 0) VERIFY_ARE_EQUAL(1 / expected, 1 / actual); - } while (!std_istream.eof()); - } -+*/ - - TEST(extract_floating_point_with_exceptions) - { +Index: cpprestsdk-2.10.16/Release/tests/functional/streams/istream_tests.cpp +=================================================================== +--- cpprestsdk-2.10.16.orig/Release/tests/functional/streams/istream_tests.cpp ++++ cpprestsdk-2.10.16/Release/tests/functional/streams/istream_tests.cpp +@@ -1305,7 +1305,7 @@ SUITE(istream_tests) + test_string.append(" 6E+4.5"); // two numbers merged in exponent + test_string.append(" 6E-4.5"); // two numbers merged in exponent + test_string.append(" 3.14 -10 +42.0 -1234.567 .01 +0 -0"); +-#ifndef __APPLE__ ++#if FLT_EVAL_METHOD > 1 + test_string.append(" 12345678901234567890123456789012345678901234567890"); // a big number + #endif + test_string.append(" 9.81E05 6.0221413e+23 1.6e-14"); // numbers with exponent diff --git a/cpprest.changes b/cpprest.changes index d5202ed..1dbe68b 100644 --- a/cpprest.changes +++ b/cpprest.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Mon Jan 4 11:02:30 UTC 2021 - Andreas Schwab + +- cpprest-2.10.9-disable-test-extract_floating_point.patch: Only disable + the problematic test +- base64.patch: Portable base64 +- filestream.patch: Fix type mismatch in basic_file_buffer + ------------------------------------------------------------------- Tue May 12 16:39:14 UTC 2020 - Guillaume GARDET diff --git a/cpprest.spec b/cpprest.spec index 375c59d..f8ccc6d 100644 --- a/cpprest.spec +++ b/cpprest.spec @@ -1,7 +1,7 @@ # # spec file for package cpprest # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -22,17 +22,19 @@ Name: cpprest Version: 2.10.16 Release: 0 Summary: C++ REST library +License: MIT AND BSD-3-Clause AND Zlib # main: MIT (license.txt) # Websocket++: BSD-3-Clause (ThirdPartyNotices.txt) # base64/base64.hpp: Zlib (ThirdPartyNotices.txt) # sha1/sha1.hpp: BSD-3-Clause (ThirdPartyNotices.txt) # common/md5.hpp: Zlib (ThirdPartyNotices.txt) # utf8_validation.hpp: MIT (ThirdPartyNotices.txt) -License: MIT AND BSD-3-Clause AND Zlib URL: https://github.com/Microsoft/cpprestsdk Source: https://github.com/Microsoft/cpprestsdk/archive/v%{version}/cpprestsdk-%{version}.tar.gz # https://github.com/Microsoft/cpprestsdk/issues/576 Patch1: cpprest-2.10.9-disable-test-extract_floating_point.patch +Patch2: base64.patch +Patch3: filestream.patch BuildRequires: cmake >= 3.0 BuildRequires: gcc-c++ BuildRequires: pkgconfig @@ -78,9 +80,9 @@ Development files. %prep %setup -q -n cpprestsdk-%{version} -%ifarch aarch64 ppc64 ppc64le %patch1 -p1 -%endif +%patch2 -p1 +%patch3 -p1 %build %cmake \ diff --git a/filestream.patch b/filestream.patch new file mode 100644 index 0000000..3b03ad6 --- /dev/null +++ b/filestream.patch @@ -0,0 +1,40 @@ +Index: cpprestsdk-2.10.16/Release/include/cpprest/filestream.h +=================================================================== +--- cpprestsdk-2.10.16.orig/Release/include/cpprest/filestream.h ++++ cpprestsdk-2.10.16/Release/include/cpprest/filestream.h +@@ -399,7 +399,7 @@ protected: + { + pplx::extensibility::scoped_recursive_lock_t lck(m_info->m_lock); + m_info->m_rdpos += 1; +- _CharType ch1 = (_CharType)callback->m_ch; ++ _CharType ch1 = callback->m_ch; + delete callback; + return pplx::task_from_result(ch1); + } +@@ -453,7 +453,7 @@ protected: + if (ch == sizeof(_CharType)) + { + pplx::extensibility::scoped_recursive_lock_t lck(m_info->m_lock); +- _CharType ch1 = (_CharType)callback->m_ch; ++ _CharType ch1 = callback->m_ch; + delete callback; + return pplx::task_from_result(ch1); + } +@@ -889,7 +889,7 @@ private: + delete this; + } + +- int_type m_ch; ++ _CharType m_ch; + + private: + _file_info* m_info; +@@ -917,7 +917,7 @@ private: + delete this; + } + +- int_type m_ch; ++ _CharType m_ch; + + virtual void on_error(const std::exception_ptr& e) + {