From ac2f0f1ca3cbba9d82c45dbda9dc51e9f949513a Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@nokia.com>
Date: Mon, 18 Oct 2010 11:10:55 +0200
Subject: [PATCH] Environment: Fix crash searching executables in windows

---
 src/libs/utils/environment.cpp | 78 +++++++++++++++++++---------------
 src/libs/utils/environment.h   |  2 +
 2 files changed, 45 insertions(+), 35 deletions(-)

diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp
index 12cb33fa7c3..6ac0381b05f 100644
--- a/src/libs/utils/environment.cpp
+++ b/src/libs/utils/environment.cpp
@@ -182,48 +182,56 @@ void Environment::clear()
 }
 
 QString Environment::searchInPath(const QString &executable,
-                                  const QStringList & additionalDirs) const
+                                  const QStringList &additionalDirs) const
 {
-    QString exec = expandVariables(executable);
+    QStringList execs;
+    execs << executable;
+#ifdef Q_OS_WIN
+    // Check all the executable extensions on windows:
+    QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';'));
 
-    if (exec.isEmpty() || QFileInfo(exec).isAbsolute())
-        return QDir::toNativeSeparators(exec);
+    // .exe.bat is legal (and run when starting new.exe), so always go through the complete list once:
+    foreach (const QString &ext, extensions)
+        execs << executable + ext.toLower();
+#endif
+    return searchInPath(execs, additionalDirs);
+}
 
-    // Check in directories:
-    foreach (const QString &dir, additionalDirs) {
-        if (dir.isEmpty())
-            continue;
-        QFileInfo fi(dir + QLatin1Char('/') + exec);
-        if (fi.isFile() && fi.isExecutable())
-            return fi.absoluteFilePath();
-    }
+QString Environment::searchInPath(const QStringList &executables,
+                                  const QStringList &additionalDirs) const
+{
+    foreach (const QString &executable, executables) {
+        QString exec = expandVariables(executable);
 
-    // Check in path:
-    if (exec.indexOf(QChar('/')) != -1)
-        return QString();
-    const QChar slash = QLatin1Char('/');
-    foreach (const QString &p, path()) {
-        QString fp = p;
-        fp += slash;
-        fp += exec;
-        const QFileInfo fi(fp);
-        if (fi.exists())
-            return fi.absoluteFilePath();
-    }
+        if (exec.isEmpty())
+            continue;
 
-#ifdef Q_OS_WIN
-    // Check all the executable extensions on windows:
-    QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';'));
-    if (extensions.isEmpty())
-        extensions.append(QLatin1String(".exe"));
+        QFileInfo baseFi(exec);
+        if (baseFi.isAbsolute() && baseFi.exists())
+            return QDir::toNativeSeparators(exec);
+
+        // Check in directories:
+        foreach (const QString &dir, additionalDirs) {
+            if (dir.isEmpty())
+                continue;
+            QFileInfo fi(dir + QLatin1Char('/') + exec);
+            if (fi.isFile() && fi.isExecutable())
+                return fi.absoluteFilePath();
+        }
 
-    // .exe.bat is legal (and run when starting new.exe), so always go through the complete list:
-    foreach (const QString &ext, extensions) {
-        QString result = searchInPath(exec + ext.toLower(), additionalDirs);
-        if (!result.isEmpty())
-            return result;
+        // Check in path:
+        const QChar slash = QLatin1Char('/');
+        if (exec.indexOf(slash) != -1)
+            continue;
+        foreach (const QString &p, path()) {
+            QString fp = p;
+            fp += slash;
+            fp += exec;
+            const QFileInfo fi(fp);
+            if (fi.exists())
+                return fi.absoluteFilePath();
+        }
     }
-#endif
     return QString();
 }
 
diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h
index 95e300dd43f..6ae08d1cd8f 100644
--- a/src/libs/utils/environment.h
+++ b/src/libs/utils/environment.h
@@ -103,6 +103,8 @@ public:
     bool operator!=(const Environment &other) const;
     bool operator==(const Environment &other) const;
 private:
+    QString searchInPath(const QStringList &executables,
+                         const QStringList & additionalDirs = QStringList()) const;
     QMap<QString, QString> m_values;
 };
 
-- 
GitLab