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.
This commit is contained in:
Richard Kimberly Heck 2019-05-27 00:06:10 -04:00
parent 48a5b16885
commit c4658f046f
3 changed files with 20 additions and 7 deletions

View 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();

View 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);
}

View 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);
///