From d7f7ddfc1802cf11d6c889ef3ee0712fb7af8da4 Mon Sep 17 00:00:00 2001 From: Richard Kimberly Heck Date: Mon, 27 May 2019 00:06:10 -0400 Subject: [PATCH] Fix crash reported by Kornel. See https://marc.info/?l=lyx-devel&m=155879185229073&w=2. The problem is that, after saving the document and reloading, the TOC is corrupted, more or less, when we run through updateBuffer. So we reset it first. --- src/Buffer.cpp | 4 ++++ src/TocBackend.cpp | 21 ++++++++++++++------- src/TocBackend.h | 2 ++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 6665a731e1..848f1f46e3 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -4980,6 +4980,10 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const setChangesPresent(false); Buffer & cbuf = const_cast(*this); + // if we are reloading, then we could have a dangling TOC, + // in effect. so we need to go ahead and reset, even though + // we will do so again when we rebuild the TOC later. + cbuf.tocBackend().reset(); // do the real work ParIterator parit = cbuf.par_iterator_begin(); diff --git a/src/TocBackend.cpp b/src/TocBackend.cpp index a253d57ca3..65f96bae89 100644 --- a/src/TocBackend.cpp +++ b/src/TocBackend.cpp @@ -204,17 +204,24 @@ bool TocBackend::updateItem(DocIterator const & dit_in) } -void TocBackend::update(bool output_active, UpdateType utype) +void TocBackend::reset() { - for (TocList::iterator it = tocs_.begin(); it != tocs_.end(); ++it) - it->second->clear(); + for (auto const & t: tocs_) + t.second->clear(); tocs_.clear(); builders_.clear(); resetOutlinerNames(); - if (!buffer_->isInternal()) { - DocIterator dit; - buffer_->inset().addToToc(dit, output_active, utype, *this); - } +} + + +void TocBackend::update(bool output_active, UpdateType utype) +{ + reset(); + if (buffer_->isInternal()) + return; + + DocIterator dit; + buffer_->inset().addToToc(dit, output_active, utype, *this); } diff --git a/src/TocBackend.h b/src/TocBackend.h index a38a972834..0e123ee5f0 100644 --- a/src/TocBackend.h +++ b/src/TocBackend.h @@ -113,6 +113,8 @@ public: void setBuffer(Buffer const * buffer) { buffer_ = buffer; } /// void update(bool output_active, UpdateType utype); + /// + void reset(); /// \return true if the item was updated. bool updateItem(DocIterator const & pit); /// -- 2.39.5