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