From 5deaaa3b137c7055bab66134c3e32c1777988253 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Tue, 11 Nov 2014 07:42:54 +0100 Subject: [PATCH] Fix memory errors found by Alfredo with valgrind BufferParams::setDocumentClass() deletes the old document class of the buffer and creates a copy of the new one. Therefore, the stored layout pointers in the paragraphs (actually only one paragraph exists) are dangling afterwards. Resetting them before setting the document class helps here. In the long term we need to get rid of BufferParams::setDocumentClass() completely, this is very ugly. --- src/CutAndPaste.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 7329c24891..1a4d5f7d41 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -502,6 +502,17 @@ void putClipboard(ParagraphList const & paragraphs, LASSERT(buffer, return); // This needs doing every time. + // Since setDocumentClass() causes deletion of the old document class + // we need to reset all layout pointers in paragraphs (otherwise they + // would be dangling). + ParIterator const end = buffer->par_iterator_end(); + for (ParIterator it = buffer->par_iterator_begin(); it != end; ++it) { + docstring const name = it->layout().name(); + if (docclass->hasLayout(name)) + it->setLayout((*docclass)[name]); + else + it->setPlainOrDefaultLayout(*docclass); + } buffer->params().setDocumentClass(docclass); // we will use pasteSelectionHelper to copy the paragraphs into the