QCoreApplication::applicationFilePath(): Fix array bounds violation of argv.

Check for argc > 0 before accessing argv[0].

tst_qapplication constructs QApplication(0, 0) and has been
observed to crash sporadically. Fix valgrind error:

=9845== Conditional jump or move depends on uninitialised value(s)
==9845==    at 0x4C2F1BC: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9845==    by 0x5DEEFB3: qstrcmp(char const*, char const*) (qbytearray.cpp:262)
==9845==    by 0x6011EAA: QCoreApplication::applicationFilePath() (qcoreapplication.cpp:2058)
==9845==    by 0x6011D0B: QCoreApplication::applicationDirPath() (qcoreapplication.cpp:2029)
==9845==    by 0x5DD285D: QLibraryInfoPrivate::findConfiguration() (qlibraryinfo.cpp:184)
==9845==    by 0x5DD32AF: QLibraryInfo::platformPluginArguments(QString const&) (qlibraryinfo.cpp:596)
==9845==    by 0x5746A95: init_platform(QString const&, QString const&, QString const&, int&, char**) (qguiapplication.cpp:1017)
==9845==    by 0x5747C91: QGuiApplicationPrivate::createPlatformIntegration() (qguiapplication.cpp:1177)
==9845==    by 0x5747DDE: QGuiApplicationPrivate::createEventDispatcher() (qguiapplication.cpp:1194)
==9845==    by 0x4FAF81D: QApplicationPrivate::createEventDispatcher() (qapplication.cpp:196)
==9845==    by 0x600F568: QCoreApplication::init() (qcoreapplication.cpp:768)
==9845==    by 0x600F2C4: QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) (qcoreapplication.cpp:689)
==9845==    by 0x574594C: QGuiApplication::QGuiApplication(QGuiApplicationPrivate&) (qguiapplication.cpp:570)
==9845==    by 0x4FB008A: QApplication::QApplication(int&, char**, int) (qapplication.cpp:569)
==9845==    by 0x41148A: tst_QApplication::lastWindowClosed() (tst_qapplication.cpp:561)

Change-Id: I2fb324ab63617f14f5f43835154aae339bfa9520
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
bb10
Friedemann Kleint 2015-06-11 10:23:52 +02:00
parent 0b8cb39d34
commit 05dcc0499b
1 changed files with 7 additions and 5 deletions

View File

@ -2054,11 +2054,13 @@ QString QCoreApplication::applicationFilePath()
QCoreApplicationPrivate *d = self->d_func();
static char *procName = d->argv[0];
if (qstrcmp(procName, d->argv[0]) != 0) {
// clear the cache if the procname changes, so we reprocess it.
QCoreApplicationPrivate::clearApplicationFilePath();
procName = d->argv[0];
if (d->argc) {
static const char *procName = d->argv[0];
if (qstrcmp(procName, d->argv[0]) != 0) {
// clear the cache if the procname changes, so we reprocess it.
QCoreApplicationPrivate::clearApplicationFilePath();
procName = d->argv[0];
}
}
if (QCoreApplicationPrivate::cachedApplicationFilePath)