Fix crash when closing master with children and grandchildren

In some cases, it is possible that the BufferPositionMap has
dangling pointers. We thus check whether the Buffer is loaded
before accessing it.

Fixes: #10766
This commit is contained in:
Juergen Spitzmueller 2017-09-28 09:06:33 +02:00
parent 745b43784c
commit 4f50cbcfe4

View File

@ -3720,8 +3720,12 @@ void Buffer::listMacroNames(MacroNameSet & macros) const
// loop over children // loop over children
Impl::BufferPositionMap::iterator it = d->children_positions.begin(); Impl::BufferPositionMap::iterator it = d->children_positions.begin();
Impl::BufferPositionMap::iterator end = d->children_positions.end(); Impl::BufferPositionMap::iterator end = d->children_positions.end();
for (; it != end; ++it) for (; it != end; ++it) {
it->first->listMacroNames(macros); Buffer * child = const_cast<Buffer *>(it->first);
// The buffer might have been closed (see #10766).
if (theBufferList().isLoaded(child))
child->listMacroNames(macros);
}
// call parent // call parent
Buffer const * const pbuf = d->parent(); Buffer const * const pbuf = d->parent();