From b0b893acbf1d2d4a4a6594d4f984918a604c5498 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Wed, 10 Feb 2010 14:49:40 +0100
Subject: [PATCH] Fixed null-pointer deref in copy/paste.

---
 .../integration/designdocumentcontroller.cpp     |  2 +-
 .../integration/designdocumentcontrollerview.cpp |  5 +++--
 .../core/include/basetexteditmodifier.h          |  4 +++-
 .../core/include/plaintexteditmodifier.h         | 16 ++++++++++++++++
 .../core/model/basetexteditmodifier.cpp          |  8 +-------
 .../core/model/plaintexteditmodifier.cpp         |  2 ++
 6 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
index c1337013c97..87b65ed8506 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
@@ -326,7 +326,7 @@ QList<RewriterView::Error> DesignDocumentController::loadMaster(QPlainTextEdit *
     connect(edit, SIGNAL(modificationChanged(bool)),
             this, SIGNAL(dirtyStateChanged(bool)));
 
-    m_d->textModifier = new BaseTextEditModifier(m_d->textEdit.data());
+    m_d->textModifier = new BaseTextEditModifier(dynamic_cast<TextEditor::BaseTextEditor*>(m_d->textEdit.data()));
 
     m_d->componentTextModifier = 0;
 
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
index 22b04108340..c3dbddb1e91 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
@@ -31,6 +31,7 @@
 #include <rewriterview.h>
 #include <basetexteditmodifier.h>
 #include <metainfo.h>
+#include <plaintexteditmodifier.h>
 
 #include <QApplication>
 #include <QPlainTextEdit>
@@ -102,7 +103,7 @@ QString DesignDocumentControllerView::toText() const
     outputModel->setMetaInfo(model()->metaInfo());
     QPlainTextEdit textEdit;
     textEdit.setPlainText("import Qt 4.6; Item {}");
-    BaseTextEditModifier modifier(&textEdit);
+    NotIndentingTextEditModifier modifier(&textEdit);
 
     QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0));
     rewriterView->setTextModifier(&modifier);
@@ -126,7 +127,7 @@ void DesignDocumentControllerView::fromText(QString text)
     QPlainTextEdit textEdit;
     QString imports("import Qt 4.6;\n");
     textEdit.setPlainText(imports + text);
-    BaseTextEditModifier modifier(&textEdit);
+    NotIndentingTextEditModifier modifier(&textEdit);
 
     QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0));
     rewriterView->setTextModifier(&modifier);
diff --git a/src/plugins/qmldesigner/core/include/basetexteditmodifier.h b/src/plugins/qmldesigner/core/include/basetexteditmodifier.h
index 0bc9c796c23..8115c2ebff8 100644
--- a/src/plugins/qmldesigner/core/include/basetexteditmodifier.h
+++ b/src/plugins/qmldesigner/core/include/basetexteditmodifier.h
@@ -34,12 +34,14 @@
 #include "corelib_global.h"
 #include "plaintexteditmodifier.h"
 
+#include <texteditor/basetexteditor.h>
+
 namespace QmlDesigner {
 
 class CORESHARED_EXPORT BaseTextEditModifier: public PlainTextEditModifier
 {
 public:
-    BaseTextEditModifier(QPlainTextEdit *textEdit);
+    BaseTextEditModifier(TextEditor::BaseTextEditor *textEdit);
 
     virtual void indent(int offset, int length);
 
diff --git a/src/plugins/qmldesigner/core/include/plaintexteditmodifier.h b/src/plugins/qmldesigner/core/include/plaintexteditmodifier.h
index 503b8924642..2d33931e6cf 100644
--- a/src/plugins/qmldesigner/core/include/plaintexteditmodifier.h
+++ b/src/plugins/qmldesigner/core/include/plaintexteditmodifier.h
@@ -66,6 +66,8 @@ public:
     virtual void move(const MoveInfo &moveInfo);
     virtual void indent(int offset, int length) = 0;
 
+    virtual int indentDepth() const = 0;
+
     virtual void startGroup();
     virtual void flushGroup();
     virtual void commitGroup();
@@ -91,6 +93,20 @@ private:
     bool m_ongoingTextChange;
 };
 
+class CORESHARED_EXPORT NotIndentingTextEditModifier: public PlainTextEditModifier
+{
+public:
+    NotIndentingTextEditModifier(QPlainTextEdit *textEdit)
+        : PlainTextEditModifier(textEdit)
+    {}
+
+    virtual void indent(int /*offset*/, int /*length*/)
+    {}
+
+    virtual int indentDepth() const
+    { return 0; }
+};
+
 }
 
 #endif // PLAINTEXTEDITMODIFIER_H
diff --git a/src/plugins/qmldesigner/core/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/core/model/basetexteditmodifier.cpp
index c6fb15d1816..5421b87d017 100644
--- a/src/plugins/qmldesigner/core/model/basetexteditmodifier.cpp
+++ b/src/plugins/qmldesigner/core/model/basetexteditmodifier.cpp
@@ -29,12 +29,11 @@
 
 #include "basetexteditmodifier.h"
 
-#include <texteditor/basetexteditor.h>
 #include <texteditor/tabsettings.h>
 
 using namespace QmlDesigner;
 
-BaseTextEditModifier::BaseTextEditModifier(QPlainTextEdit *textEdit):
+BaseTextEditModifier::BaseTextEditModifier(TextEditor::BaseTextEditor *textEdit):
         PlainTextEditModifier(textEdit)
 {
 }
@@ -44,9 +43,7 @@ void BaseTextEditModifier::indent(int offset, int length)
     if (length == 0 || offset < 0 || offset + length >= text().length())
         return;
 
-//    qDebug() << "PlainTextEditModifier::indent(" << offset << "," << length << ")";
     if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) {
-//        qDebug() << "**** Doing indentation";
         // find the applicable block:
         QTextDocument *doc = bte->document();
         QTextCursor tc(doc);
@@ -55,8 +52,6 @@ void BaseTextEditModifier::indent(int offset, int length)
         tc.setPosition(offset + length, QTextCursor::KeepAnchor);
         bte->indentInsertedText(tc);
         tc.endEditBlock();
-    } else {
-//        qDebug() << "**** Skipping indentation";
     }
 }
 
@@ -65,7 +60,6 @@ int BaseTextEditModifier::indentDepth() const
     if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) {
         return bte->tabSettings().m_indentSize;
     } else {
-        Q_ASSERT(false && "BaseTextEditModifier does not have a BaseTextEditor");
         return 0;
     }
 }
diff --git a/src/plugins/qmldesigner/core/model/plaintexteditmodifier.cpp b/src/plugins/qmldesigner/core/model/plaintexteditmodifier.cpp
index 4eb5512da9f..2ef424cb45a 100644
--- a/src/plugins/qmldesigner/core/model/plaintexteditmodifier.cpp
+++ b/src/plugins/qmldesigner/core/model/plaintexteditmodifier.cpp
@@ -46,6 +46,8 @@ PlainTextEditModifier::PlainTextEditModifier(QPlainTextEdit *textEdit):
         m_pendingChangeSignal(false),
         m_ongoingTextChange(false)
 {
+    Q_ASSERT(textEdit);
+
     connect(m_textEdit, SIGNAL(textChanged()),
             this, SLOT(textEditChanged()));
 }
-- 
GitLab