Windows: Reintroduce copy of argv.
Since argc/argv is modified by QCoreApplication-derived classes, a copy of the original arguments is needed for comparison. This fixes a crash in Qt Quick 2 tests (which use the -qmljsdebugger=<port> argument) introduced by dff18b8e80609da91bf9e9134967dcf0d23eca9e . Task-number: QTBUG-30330 Change-Id: Ic145ac923e0a7c504ab16602c8686268e4fd9700 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
This commit is contained in:
parent
0866680bd9
commit
29daa7645b
@ -414,7 +414,8 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
|
|||||||
argc(aargc)
|
argc(aargc)
|
||||||
, argv(aargv)
|
, argv(aargv)
|
||||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||||
, modifiedArgv(false)
|
, origArgc(0)
|
||||||
|
, origArgv(Q_NULLPTR)
|
||||||
#endif
|
#endif
|
||||||
, application_type(QCoreApplicationPrivate::Tty)
|
, application_type(QCoreApplicationPrivate::Tty)
|
||||||
#ifndef QT_NO_QOBJECT
|
#ifndef QT_NO_QOBJECT
|
||||||
@ -432,7 +433,11 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
|
|||||||
argv = (char **)∅
|
argv = (char **)∅
|
||||||
}
|
}
|
||||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||||
modifiedArgv = isArgvModified(argc, argv);
|
if (!isArgvModified(argc, argv)) {
|
||||||
|
origArgc = argc;
|
||||||
|
origArgv = new char *[argc];
|
||||||
|
std::copy(argv, argv + argc, origArgv);
|
||||||
|
}
|
||||||
#endif // Q_OS_WIN && !Q_OS_WINRT
|
#endif // Q_OS_WIN && !Q_OS_WINRT
|
||||||
|
|
||||||
#ifndef QT_NO_QOBJECT
|
#ifndef QT_NO_QOBJECT
|
||||||
@ -457,6 +462,9 @@ QCoreApplicationPrivate::~QCoreApplicationPrivate()
|
|||||||
{
|
{
|
||||||
#ifndef QT_NO_QOBJECT
|
#ifndef QT_NO_QOBJECT
|
||||||
cleanupThreadData();
|
cleanupThreadData();
|
||||||
|
#endif
|
||||||
|
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||||
|
delete [] origArgv;
|
||||||
#endif
|
#endif
|
||||||
QCoreApplicationPrivate::clearApplicationFilePath();
|
QCoreApplicationPrivate::clearApplicationFilePath();
|
||||||
}
|
}
|
||||||
@ -2194,11 +2202,12 @@ QStringList QCoreApplication::arguments()
|
|||||||
}
|
}
|
||||||
#endif // Q_OS_WINCE
|
#endif // Q_OS_WINCE
|
||||||
|
|
||||||
if (!self->d_func()->modifiedArgv) {
|
const QCoreApplicationPrivate *d = self->d_func();
|
||||||
|
if (d->origArgv) {
|
||||||
const QStringList allArguments = qWinCmdArgs(cmdline);
|
const QStringList allArguments = qWinCmdArgs(cmdline);
|
||||||
Q_ASSERT(allArguments.size() == __argc);
|
Q_ASSERT(allArguments.size() == d->origArgc);
|
||||||
for (int i = 0; i < __argc; ++i) {
|
for (int i = 0; i < d->origArgc; ++i) {
|
||||||
if (contains(ac, av, __argv[i]))
|
if (contains(ac, av, d->origArgv[i]))
|
||||||
list.append(allArguments.at(i));
|
list.append(allArguments.at(i));
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
|
@ -116,7 +116,8 @@ public:
|
|||||||
int &argc;
|
int &argc;
|
||||||
char **argv;
|
char **argv;
|
||||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||||
bool modifiedArgv;
|
int origArgc;
|
||||||
|
char **origArgv; // store unmodified arguments for QCoreApplication::arguments()
|
||||||
#endif
|
#endif
|
||||||
void appendApplicationPathToLibraryPaths(void);
|
void appendApplicationPathToLibraryPaths(void);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user