summaryrefslogtreecommitdiff
path: root/ucb
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2021-11-23 21:24:02 +0100
committerMichael Stahl <michael.stahl@allotropia.de>2021-11-24 09:39:14 +0100
commitc3db9d7a440f34f3faffee6583da5381a59d5c2a (patch)
tree1fcf91dd43c89a361b6ff89b0485bac5a52d1ed3 /ucb
parent07941bfa4844f794a1e50a28c3eb28b24ad94a41 (diff)
ucb: webdav-curl: properly reset CURLOPT_INFILESIZE_LARGE
If the value is set to 0, then the next PROPFIND after PUT will not append the "Expect: 100-continue" header, and hang without uploading. See Curl_http_bodysend() which checks for != 0. Unfortunately with different default values for "long" and "curl_off_t" CurlOption becomes a little more complicated. (regression from 8e34fe50412fd58a600ba1b8238b80444aec02e5) Change-Id: I55ea02659f7a64f373e89a6d02d6865c158fd0c6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125742 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'ucb')
-rw-r--r--ucb/source/ucp/webdav-curl/CurlSession.cxx81
1 files changed, 21 insertions, 60 deletions
diff --git a/ucb/source/ucp/webdav-curl/CurlSession.cxx b/ucb/source/ucp/webdav-curl/CurlSession.cxx
index e3c5fdc19191..509c7bc24629 100644
--- a/ucb/source/ucp/webdav-curl/CurlSession.cxx
+++ b/ucb/source/ucp/webdav-curl/CurlSession.cxx
@@ -124,17 +124,9 @@ struct CurlOption
Type const Tag;
union {
void const* const pValue;
- long const lValue;
- curl_off_t const cValue;
+ long /*const*/ lValue;
+ curl_off_t /*const*/ cValue;
};
-#if 0
- ::std::variant<void const*, long
-#if SAL_TYPES_SIZEOFLONG == 4
- ,
- curl_off_t
-#endif
- > const Value;
-#endif
char const* const pExceptionString;
CurlOption(CURLoption const i_Option, void const* const i_Value,
@@ -145,23 +137,27 @@ struct CurlOption
, pExceptionString(i_pExceptionString)
{
}
- CurlOption(CURLoption const i_Option, long const i_Value, char const* const i_pExceptionString)
- : Option(i_Option)
- , Tag(Type::Long)
- , lValue(i_Value)
- , pExceptionString(i_pExceptionString)
- {
- }
-#if SAL_TYPES_SIZEOFLONG == 4
+ // Depending on platform, curl_off_t may be "long" or a larger type
+ // so cannot use overloading to distinguish these cases.
CurlOption(CURLoption const i_Option, curl_off_t const i_Value,
- char const* const i_pExceptionString)
+ char const* const i_pExceptionString, Type const type = Type::Long)
: Option(i_Option)
- , Tag(Type::CurlOffT)
- , cValue(i_Value)
+ , Tag(type)
, pExceptionString(i_pExceptionString)
{
+ static_assert(sizeof(long) <= sizeof(curl_off_t));
+ switch (type)
+ {
+ case Type::Long:
+ lValue = i_Value;
+ break;
+ case Type::CurlOffT:
+ cValue = i_Value;
+ break;
+ default:
+ assert(false);
+ }
}
-#endif
};
/// combined guard class to ensure things are released in correct order,
@@ -200,22 +196,6 @@ public:
for (auto const& it : m_Options)
{
CURLcode rc(CURL_LAST); // warning C4701
-#if 0
- if (void const* const* const pp = ::std::get_if<void const*>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, *pp);
- }
- else if (long const * const pLong = ::std::get_if<long>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, *pLong);
- }
-#if SAL_TYPES_SIZEOFLONG == 4
- else if (curl_off_t const* const pOfft = ::std::get_if<curl_off_t>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, *pOfft);
- }
-#endif
-#endif
if (it.Tag == CurlOption::Type::Pointer)
{
rc = curl_easy_setopt(m_pCurl, it.Option, it.pValue);
@@ -224,12 +204,10 @@ public:
{
rc = curl_easy_setopt(m_pCurl, it.Option, it.lValue);
}
-#if SAL_TYPES_SIZEOFLONG == 4
else if (it.Tag == CurlOption::Type::CurlOffT)
{
rc = curl_easy_setopt(m_pCurl, it.Option, it.cValue);
}
-#endif
else
{
assert(false);
@@ -258,22 +236,6 @@ public:
for (auto const& it : m_Options)
{
CURLcode rc(CURL_LAST); // warning C4701
-#if 0
- if (void const* const* const pp = ::std::get_if<void const*>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, nullptr);
- }
- else if (long const * const pLong = ::std::get_if<long>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, 0L);
- }
-#if SAL_TYPES_SIZEOFLONG == 4
- else if (curl_off_t const* const pOfft = ::std::get_if<curl_off_t>(&it.Value))
- {
- rc = curl_easy_setopt(m_pCurl, it.Option, curl_off_t(0));
- }
-#endif
-#endif
if (it.Tag == CurlOption::Type::Pointer)
{
rc = curl_easy_setopt(m_pCurl, it.Option, nullptr);
@@ -282,12 +244,10 @@ public:
{
rc = curl_easy_setopt(m_pCurl, it.Option, 0L);
}
-#if SAL_TYPES_SIZEOFLONG == 4
else if (it.Tag == CurlOption::Type::CurlOffT)
{
- rc = curl_easy_setopt(m_pCurl, it.Option, curl_off_t(0));
+ rc = curl_easy_setopt(m_pCurl, it.Option, curl_off_t(-1));
}
-#endif
else
{
assert(false);
@@ -1830,7 +1790,8 @@ auto CurlSession::PUT(OUString const& rURIReference,
// lock m_Mutex after accessing global LockStore to avoid deadlock
- ::std::vector<CurlOption> const options{ { CURLOPT_INFILESIZE_LARGE, len, nullptr } };
+ ::std::vector<CurlOption> const options{ { CURLOPT_INFILESIZE_LARGE, len, nullptr,
+ CurlOption::Type::CurlOffT } };
CurlProcessor::ProcessRequest(*this, uri, options, &rEnv, ::std::move(pList), nullptr,
&rxInStream, nullptr);