summaryrefslogtreecommitdiff
path: root/ucb
diff options
context:
space:
mode:
authorJean-Louis Fuchs <jean-louis.fuchs@adfinis-sygroup.ch>2020-03-27 17:27:51 +0100
committerMike Kaganski <mike.kaganski@collabora.com>2020-04-29 08:07:35 +0200
commit58b84caca87c893ac04f0b1399aeadc839a2f075 (patch)
tree1e06f0d37e87bb81321c9e3bd66a30bee70af172 /ucb
parent19ead7b99948fee9557bd569df1dfaf226364287 (diff)
tdf#132460 Fix feedback-loop during WebDAV lock refresh
Prevent a feedback-loop, where LibreOffice would request a shorter timeout on each refresh. WebDAV servers do not return the lock-timeout the lock was set up with; they have to return the remaining time. There are WebDAV servers that return a lower timeout. Two examples [2] [3]. Other servers probably reuse the same timestamp for the whole request and are therefore not subject to that problem. (This might even be incorrect if the request takes very long.) Updating the lock-timeout with the value returned by the server decreases the timeout until it reaches zero. LibreOffice request SERVER response LOCK(180) -> LOCK(60) LOCK(60) -> LOCK(59) LOCK(59) -> LOCK(58) ... 0: no LOCK header -> FAIL If we do not update the timeout in NeonSession::LOCK() only the initial setup updates the timeout. LibreOffice request SERVER response LOCK(180) -> LOCK(60) LOCK(60) -> LOCK(59) LOCK(60) -> LOCK(59) ... It is essential that lastChanceToSendRefreshRequest uses the timeout returned by the server; after it calculated the deadline, we reset the timeout. The maintainer of neon confirmed that the timeout should stay the same after the initial setup. [4]. [1] https://tools.ietf.org/html/rfc4918#section-6.6 [2] https://www.alfresco.com/ [3] https://github.com/mar10/wsgidav [4] https://github.com/notroj/neon/issues/12 Change-Id: Ie76338f7a88f41f47569a62ea6efec8c6f646f50 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92981 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'ucb')
-rw-r--r--ucb/source/ucp/webdav-neon/NeonSession.cxx7
1 files changed, 6 insertions, 1 deletions
diff --git a/ucb/source/ucp/webdav-neon/NeonSession.cxx b/ucb/source/ucp/webdav-neon/NeonSession.cxx
index c178c1e90238..8ea1db57e5cb 100644
--- a/ucb/source/ucp/webdav-neon/NeonSession.cxx
+++ b/ucb/source/ucp/webdav-neon/NeonSession.cxx
@@ -1624,6 +1624,10 @@ bool NeonSession::LOCK( NeonLock * pLock,
TimeValue startCall;
osl_getSystemTime( &startCall );
+ // save the current requested timeout, because ne_lock_refresh uses
+ // pLock->timeout as an out parameter. This prevents a feedback-loop,
+ // where we would request a shorter timeout on each refresh.
+ long timeout = pLock->timeout;
const int theRetVal = ne_lock_refresh(m_pHttpSession, pLock);
if (theRetVal == NE_OK)
{
@@ -1631,7 +1635,6 @@ bool NeonSession::LOCK( NeonLock * pLock,
= lastChanceToSendRefreshRequest( startCall, pLock->timeout );
SAL_INFO( "ucb.ucp.webdav", "LOCK (refresh) - Lock successfully refreshed." );
- return true;
}
else
{
@@ -1648,6 +1651,8 @@ bool NeonSession::LOCK( NeonLock * pLock,
}
return false;
}
+ pLock->timeout = timeout;
+ return theRetVal;
}
void NeonSession::UNLOCK( const OUString & inPath,