diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index d2805f52e1e..3d880fdb46d 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -3619,6 +3619,14 @@ bool qEnvironmentVariableIsSet(const char *varName) noexcept */ bool qputenv(const char *varName, const QByteArray &value) { + // protect against non-NUL-terminated QByteArrays: + if (!const_cast(value).data_ptr()->isMutable()) { + QByteArray copy(value); + copy.reserve(copy.size() + 1); // ensures NUL termination (and isMutable() even for size==0 + // (unlike detach()) to avoid infinite recursion) + return qputenv(varName, copy); + } + #if defined(Q_CC_MSVC) const auto locker = qt_scoped_lock(environmentMutex); return _putenv_s(varName, value.constData()) == 0; diff --git a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp index 77a7fa41942..f914ee5f232 100644 --- a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp +++ b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp @@ -60,7 +60,11 @@ void tst_QGetPutEnv::getSetCheck() QCOMPARE(sresult, QString()); #endif - QVERIFY(qputenv(varName, QByteArray("supervalue"))); + constexpr char varValueFullString[] = "supervalue123"; + const auto varValueQBA = QByteArray::fromRawData(varValueFullString, sizeof varValueFullString - 4); + QCOMPARE_EQ(varValueQBA, "supervalue"); + + QVERIFY(qputenv(varName, varValueQBA)); QVERIFY(qEnvironmentVariableIsSet(varName)); QVERIFY(!qEnvironmentVariableIsEmpty(varName));