crashtesting: clear the tracked-change flag when dropping...

...the footnote mark buffer

A custom footnote mark is buffered into m_aSuperBuffer, and when the
mark sits inside a tracked insertion the start of the tracked change is
buffered there too.

The footnote path copies the mark text out and then clears
m_aSuperBuffer. So the buffered start is discarded but the states that
buffered into it still had their StartedTrackchange set.

On group close they emitted an end that has no start, and
RemoveTopRedline attempted to pop an empty redline stack.

So clear the flag on those states when the buffer is dropped.

seen loading ooo53739-2.doc converted to rtf and reloaded (also
ooo83985-4.doc), where the footnote sits inside the tracked insertion as

{\revised... {\super b{\*\footnote ...}}}

 #1 writerfilter::dmapper::DomainMapper_Impl::RemoveTopRedline at engine/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx:10035
 #2 writerfilter::dmapper::DomainMapper::sprmWithProps at engine/sw/source/writerfilter/dmapper/DomainMapper.cxx:3242
 #3 writerfilter::dmapper::DomainMapper::lcl_sprm at engine/sw/source/writerfilter/dmapper/DomainMapper.cxx:1614
 #4 writerfilter::LoggedProperties::sprm at engine/sw/source/writerfilter/dmapper/LoggedResources.cxx:365
 #5 writerfilter::rtftok::RTFReferenceProperties::resolve at engine/sw/source/writerfilter/rtftok/rtfreferenceproperties.cxx:34
 #6 writerfilter::dmapper::DomainMapper::lcl_props at engine/sw/source/writerfilter/dmapper/DomainMapper.cxx:4970
 #7 writerfilter::LoggedStream::props at engine/sw/source/writerfilter/dmapper/LoggedResources.cxx:244
 #8 writerfilter::rtftok::RTFDocumentImpl::replayBuffer at engine/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx:1921
 #9 writerfilter::rtftok::RTFDocumentImpl::popState at engine/sw/source/writerfilter/rtftok/rtfdocumentimpl.cxx:3899

see also:

commit 013ec10d4e
Date:   Wed Oct 22 22:35:01 2014 +0200

    i#84172 RTF import: handle nested groups inside redlines

Change-Id: I2a7c5f3d3aef328a6e5a663dddc72175066fcafc
Signed-off-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/4724
Tested-by: Jenkins CPCI <releng@collaboraoffice.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
(cherry picked from commit 69a5dcf79103b16d44bdab56a94242ede0347977)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/207398
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
This commit is contained in:
Caolán McNamara
2026-06-29 13:54:58 +02:00
committed by Xisco Fauli
parent d89e2655f9
commit bd11de9abf
@@ -289,6 +289,15 @@ RTFError RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
}
}
m_aSuperBuffer.clear();
// Clearing m_aSuperBuffer discards everything buffered into
// it, including a tracked-change start. The states still
// pointing at it can no longer replay that start, so clear
// StartedTrackchange on them to drop the matching end.
for (std::size_t i = 0; i < m_aStates.size(); ++i)
{
if (m_aStates[i].getCurrentBuffer() == &m_aSuperBuffer)
m_aStates[i].setStartedTrackchange(false);
}
m_aStates.top().setDestination(Destination::FOOTNOTE);
Mapper().startCharacterGroup();
runProps();