]> git.lyx.org Git - features.git/commitdiff
Fix crash reported by Kornel.
authorRichard Kimberly Heck <rikiheck@lyx.org>
Mon, 27 May 2019 04:06:10 +0000 (00:06 -0400)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:30 +0000 (15:48 +0200)
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
src/TocBackend.cpp
src/TocBackend.h

index 6665a731e17b00bbbd2990b0459156942b74664a..848f1f46e3bb7e87e3aac9b84f8af0cd2c44ed38 100644 (file)
@@ -4980,6 +4980,10 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
        setChangesPresent(false);
 
        Buffer & cbuf = const_cast<Buffer &>(*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();
index a253d57ca337ec2903d4ecc6b9b8f5d9975e82e9..65f96bae892421254ac52607e8668e52ce38a01e 100644 (file)
@@ -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);
 }
 
 
index a38a972834f9c2155af1dbb6f1f512a3eb5a8efc..0e123ee5f033977201c1f795735eeb7a0a2417b9 100644 (file)
@@ -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);
        ///