Kaydet (Commit) 269d6d33 authored tarafından Michael Stahl's avatar Michael Stahl

ofz#5435 sw: fix SwCache::Insert() stale pointers

If SwCache::Insert() happens to delete the object that m_pFirst or
m_pRealFirst point to, which is unlikely as it means every other object
is locked, then these pointers must be updated.

This sometimes happens in the bugdoc after scrolling around for some
time.

Change-Id: I13f04d28c37969469efa4e1109c7f5b751ceba96
Reviewed-on: https://gerrit.libreoffice.org/49151Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 21d664e9
...@@ -389,16 +389,34 @@ bool SwCache::Insert( SwCacheObj *pNew ) ...@@ -389,16 +389,34 @@ bool SwCache::Insert( SwCacheObj *pNew )
nPos = pObj->GetCachePos(); nPos = pObj->GetCachePos();
if ( pObj == m_pLast ) if ( pObj == m_pLast )
{ OSL_ENSURE( pObj->GetPrev(), "Last but no Prev" ); {
m_pLast = pObj->GetPrev(); m_pLast = pObj->GetPrev();
m_pLast->SetNext( nullptr ); assert(m_pLast); // must have capacity > 1
} }
else if (pObj == m_pFirst)
{ {
if ( pObj->GetPrev() ) if (pObj->GetNext())
pObj->GetPrev()->SetNext( pObj->GetNext() ); {
if ( pObj->GetNext() ) m_pFirst = pObj->GetNext();
pObj->GetNext()->SetPrev( pObj->GetPrev() ); }
else
{
m_pFirst = pObj->GetPrev();
}
assert(m_pFirst); // must have capacity > 1
}
if (pObj == m_pRealFirst)
{
m_pRealFirst = pObj->GetNext();
assert(m_pRealFirst); // must have capacity > 1
}
if (pObj->GetPrev())
{
pObj->GetPrev()->SetNext( pObj->GetNext() );
}
if (pObj->GetNext())
{
pObj->GetNext()->SetPrev( pObj->GetPrev() );
} }
delete pObj; delete pObj;
m_aCacheObjects[nPos] = pNew; m_aCacheObjects[nPos] = pNew;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment