From 6ffb358822db2e0d30fb34853c3222cd866d57c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Thu, 15 Feb 2018 14:44:56 +0100 Subject: un-crash QPlainTestLogger::printMessage() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit cf4a6111150d866424ee07bda80a1d38f24ea02d refactored out test identifier buildup into a standalone function, but it returned the QTestCharBuffer as a value type, which ultimately caused it to crash: Unfortunately QTestCharBuffer is not copied correctly: Since it uses the default copy ctor it will copy the buf pointer and create a deep copy of the staticBuf pointer. When the dtor was later called it would then end up calling free(buf) (where buf pointed to the staticBuf of the original QTestCharBuffer). Change-Id: Ifa290658be6f077a0d6613451c26aeeffc8df41c Reviewed-by: Tor Arne Vestbø --- src/testlib/qplaintestlogger.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'src/testlib') diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp index 25c9655691..825d9d5d0e 100644 --- a/src/testlib/qplaintestlogger.cpp +++ b/src/testlib/qplaintestlogger.cpp @@ -223,10 +223,8 @@ void QPlainTestLogger::outputMessage(const char *str) outputString(str); } -static QTestCharBuffer testIdentifier() +static void testIdentifier(QTestCharBuffer *identifier) { - QTestCharBuffer identifier; - const char *testObject = QTestResult::currentTestObjectName(); const char *testFunction = QTestResult::currentTestFunction() ? QTestResult::currentTestFunction() : "UnknownTestFunc"; @@ -234,8 +232,7 @@ static QTestCharBuffer testIdentifier() const char *globalDataTag = QTestResult::currentGlobalDataTag() ? QTestResult::currentGlobalDataTag() : ""; const char *tagFiller = (dataTag[0] && globalDataTag[0]) ? ":" : ""; - QTest::qt_asprintf(&identifier, "%s::%s(%s%s%s)", testObject, testFunction, globalDataTag, tagFiller, dataTag); - return identifier; + QTest::qt_asprintf(identifier, "%s::%s(%s%s%s)", testObject, testFunction, globalDataTag, tagFiller, dataTag); } void QPlainTestLogger::printMessage(const char *type, const char *msg, const char *file, int line) @@ -256,8 +253,10 @@ void QPlainTestLogger::printMessage(const char *type, const char *msg, const cha } const char *msgFiller = msg[0] ? " " : ""; + QTestCharBuffer testIdent; + testIdentifier(&testIdent); QTest::qt_asprintf(&messagePrefix, "%s: %s%s%s%s\n", - type, testIdentifier().data(), msgFiller, msg, failureLocation.data()); + type, testIdent.data(), msgFiller, msg, failureLocation.data()); // In colored mode, printf above stripped our nonprintable control characters. // Put them back. -- cgit v1.2.3