SHA256
8
0
forked from pool/cpprest

Accepting request 860140 from home:Andreas_Schwab:Factory

- 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

OBS-URL: https://build.opensuse.org/request/show/860140
OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/cpprest?expand=0&rev=49
This commit is contained in:
2021-01-04 13:08:51 +00:00
committed by Git OBS Bridge
parent 6c8a011653
commit a8203a57f5
5 changed files with 225 additions and 24 deletions

158
base64.patch Normal file
View File

@@ -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<unsigned char, 128> _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<unsigned char> _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<unsigned char> _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<const _triple_byte*>(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<const _single_byte*>(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<const _double_byte*>(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]));

View File

@@ -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

View File

@@ -1,3 +1,11 @@
-------------------------------------------------------------------
Mon Jan 4 11:02:30 UTC 2021 - Andreas Schwab <schwab@suse.de>
- 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 <guillaume.gardet@opensuse.org>

View File

@@ -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 \

40
filestream.patch Normal file
View File

@@ -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<int_type>(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<int_type>(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)
{