commit 5deaaa3b137c7055bab66134c3e32c1777988253
Author: Georg Baum <[email protected]>
Date:   Tue Nov 11 07:42:54 2014 +0100

    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.

diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp
index 7329c24..1a4d5f7 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

Reply via email to