From db671e820252393a1ccb1473251e4e7531cce1d4 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 22 Oct 2010 11:27:45 +0200
Subject: [PATCH] Debugger: Avoid crashes when no C++-engine is available.

Check for valid runcontrols in various places and initialize
m_engine correcly. In the case of QML-Debugging, handle
NoEngineType.

Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
Task-number: QTCREATORBUG-2086
---
 src/plugins/debugger/debuggerplugin.cpp | 22 +++++++++++++---------
 src/plugins/debugger/debuggerrunner.cpp |  8 +++++---
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 5a7b1b7b33f..659ec059c85 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1790,7 +1790,9 @@ void DebuggerPluginPrivate::startExternalApplication()
         && (sp.processArgs.front() == _("@tcf@") || sp.processArgs.front() == _("@sym@")))
         sp.toolChainType = ToolChain::RVCT_ARMV5;
 
-    startDebugger(m_debuggerRunControlFactory->create(sp));
+
+    if (RunControl *rc = m_debuggerRunControlFactory->create(sp))
+        startDebugger(rc);
 }
 
 void DebuggerPluginPrivate::notifyCurrentEngine(int role, const QVariant &value)
@@ -1820,8 +1822,8 @@ void DebuggerPluginPrivate::attachExternalApplication
     sp.executable = binary;
     sp.crashParameter = crashParameter;
     sp.startMode = crashParameter.isEmpty() ? AttachExternal : AttachCrashedExternal;
-    DebuggerRunControl *rc = createDebugger(sp);
-    startDebugger(rc);
+    if (DebuggerRunControl *rc = createDebugger(sp))
+        startDebugger(rc);
 }
 
 void DebuggerPluginPrivate::attachCore()
@@ -1843,8 +1845,8 @@ void DebuggerPluginPrivate::attachCore(const QString &core, const QString &exe)
     sp.coreFile = core;
     sp.displayName = tr("Core file \"%1\"").arg(core);
     sp.startMode = AttachCore;
-    DebuggerRunControl *rc = createDebugger(sp);
-    startDebugger(rc);
+    if (DebuggerRunControl *rc = createDebugger(sp))
+        startDebugger(rc);
 }
 
 void DebuggerPluginPrivate::attachRemote(const QString &spec)
@@ -1856,8 +1858,8 @@ void DebuggerPluginPrivate::attachRemote(const QString &spec)
     sp.remoteArchitecture = spec.section('@', 2, 2);
     sp.displayName = tr("Remote: \"%1\"").arg(sp.remoteChannel);
     sp.startMode = AttachToRemote;
-    DebuggerRunControl *rc = createDebugger(sp);
-    startDebugger(rc);
+    if (DebuggerRunControl *rc = createDebugger(sp))
+        startDebugger(rc);
 }
 
 void DebuggerPluginPrivate::startRemoteApplication()
@@ -1902,7 +1904,8 @@ void DebuggerPluginPrivate::startRemoteApplication()
     sp.useServerStartScript = dlg.useServerStartScript();
     sp.serverStartScript = dlg.serverStartScript();
     sp.sysRoot = dlg.sysRoot();
-    startDebugger(createDebugger(sp));
+    if (RunControl *rc = createDebugger(sp))
+        startDebugger(rc);
 }
 
 void DebuggerPluginPrivate::enableReverseDebuggingTriggered(const QVariant &value)
@@ -1940,7 +1943,8 @@ void DebuggerPluginPrivate::attachRemoteTcf()
     sp.startMode = AttachTcf;
     if (dlg.useServerStartScript())
         sp.serverStartScript = dlg.serverStartScript();
-    startDebugger(createDebugger(sp));
+    if (RunControl *rc = createDebugger(sp))
+        startDebugger(rc);
 }
 
 bool DebuggerPluginPrivate::attachCmdLine()
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 03b2853f938..89ffcc13701 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -276,7 +276,8 @@ unsigned DebuggerRunnerPrivate::enabledEngines() const
 
 DebuggerRunnerPrivate::DebuggerRunnerPrivate(RunConfiguration *runConfiguration,
                                              unsigned enabledEngines) :
-      m_myRunConfiguration(runConfiguration)
+      m_engine(0)
+    , m_myRunConfiguration(runConfiguration)
     , m_running(false)
     , m_cmdLineEnabledEngines(enabledEngines)
 {
@@ -439,10 +440,11 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &startParams
             && !sp.executable.isEmpty())
         engineType = engineForExecutable(enabledEngineTypes, sp.executable);
 
-    if (!engineType)
+    if (engineType == NoEngineType)
         engineType = engineForMode(enabledEngineTypes, sp.startMode);
 
-    if (engineType != QmlEngineType && (activeLangs & QmlLanguage)) {
+    if ((engineType != QmlEngineType && engineType != NoEngineType)
+        && (activeLangs & QmlLanguage)) {
         if (activeLangs & CppLanguage) {
             sp.cppEngineType = engineType;
             engineType = QmlCppEngineType;
-- 
GitLab