aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-03-01 11:35:32 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2018-03-01 13:59:38 +0000
commit053b31802b3520b083a8fc587cd367251fa0b2d8 (patch)
tree02c304da08f86968e12527e82a733b5fdab1ffc7 /src
parentff2b76e82b6eb1b478383fffee49236d9e5e8bf4 (diff)
Fix race condition in MSVC detection code
Two or more threads could simultaneously call qputenv() when building for several configurations. Change-Id: Ia2edce48d5088018a0ebe650c93c3faabc9d91cd Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/lib/corelib/tools/msvcinfo.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp
index 0a79df87e..041cf26b4 100644
--- a/src/lib/corelib/tools/msvcinfo.cpp
+++ b/src/lib/corelib/tools/msvcinfo.cpp
@@ -54,17 +54,20 @@
#endif
#include <algorithm>
+#include <mutex>
using namespace qbs;
using namespace qbs::Internal;
+static std::recursive_mutex envMutex;
+
static QString mkStr(const char *s) { return QString::fromLocal8Bit(s); }
static QString mkStr(const QByteArray &ba) { return mkStr(ba.constData()); }
class TemporaryEnvChanger
{
public:
- TemporaryEnvChanger(const QProcessEnvironment &envChanges)
+ TemporaryEnvChanger(const QProcessEnvironment &envChanges) : m_locker(envMutex)
{
QProcessEnvironment currentEnv = QProcessEnvironment::systemEnvironment();
for (const QString &key : envChanges.keys()) {
@@ -81,6 +84,7 @@ public:
private:
QProcessEnvironment m_changesToRestore;
+ std::lock_guard<std::recursive_mutex> m_locker;
};
static QByteArray runProcess(const QString &exeFilePath, const QStringList &args,
@@ -235,6 +239,7 @@ void MSVC::determineCompilerVersion()
}
DummyFile fileDeleter(cppFilePath);
+ std::lock_guard<std::recursive_mutex> locker(envMutex);
const QByteArray origPath = qgetenv("PATH");
qputenv("PATH", environment.value(StringConstants::pathEnvVar()).toLatin1() + ';' + origPath);
QByteArray versionStr = runProcess(