From 0407364392abca866ee5a3da3c89ad41811ed81f Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Tue, 5 Jan 2016 09:53:42 -0500 Subject: [PATCH] Fix bug #9907: We get a crash if we first close a master buffer one of whose children is also a child of another buffer, then try to close that one. The problem is that we do not check properly to make sure that the child is not a child of some other buffer. Now we do. --- src/frontends/qt4/GuiView.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 548381b5f3..c2101f3965 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -2849,23 +2849,31 @@ bool GuiView::closeBuffer(Buffer & buf) ListOfBuffers::const_iterator it = clist.begin(); ListOfBuffers::const_iterator const bend = clist.end(); for (; it != bend; ++it) { - // If a child is dirty, do not close - // without user intervention - //FIXME: should we look in other tabworkareas? Buffer * child_buf = *it; + if (theBufferList().isOthersChild(&buf, child_buf)) { + child_buf->setParent(0); + continue; + } + + // FIXME: should we look in other tabworkareas? + // ANSWER: I don't think so. I've tested, and if the child is + // open in some other window, it closes without a problem. GuiWorkArea * child_wa = workArea(*child_buf); if (child_wa) { - if (!closeWorkArea(child_wa, true)) { - success = false; + success = closeWorkArea(child_wa, true); + if (!success) break; - } - } else - theBufferList().releaseChild(&buf, child_buf); + } else { + // In this case the child buffer is open but hidden. + // It therefore should not (MUST NOT) be dirty! + LATTEST(child_buf->isClean()); + theBufferList().release(child_buf); + } } } if (success) { // goto bookmark to update bookmark pit. - //FIXME: we should update only the bookmarks related to this buffer! + // FIXME: we should update only the bookmarks related to this buffer! LYXERR(Debug::DEBUG, "GuiView::closeBuffer()"); for (size_t i = 0; i < theSession().bookmarks().size(); ++i) guiApp->gotoBookmark(i+1, false, false);