summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2015-02-09 17:34:06 +0100
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-02-10 17:00:05 +0000
commit29daa7645b8d93e4a53e8cd85288740a80f441e9 (patch)
tree8e69234bb46ba363dbdf118ecb3f064912565511
parent0866680bd904aff4fe2a643a2b81c460cbb99c77 (diff)
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>
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp21
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h3
2 files changed, 17 insertions, 7 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 41ebc95708..f443e8f37c 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -414,7 +414,8 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
argc(aargc)
, argv(aargv)
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- , modifiedArgv(false)
+ , origArgc(0)
+ , origArgv(Q_NULLPTR)
#endif
, application_type(QCoreApplicationPrivate::Tty)
#ifndef QT_NO_QOBJECT
@@ -432,7 +433,11 @@ QCoreApplicationPrivate::QCoreApplicationPrivate(int &aargc, char **aargv, uint
argv = (char **)&empty;
}
#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
#ifndef QT_NO_QOBJECT
@@ -458,6 +463,9 @@ QCoreApplicationPrivate::~QCoreApplicationPrivate()
#ifndef QT_NO_QOBJECT
cleanupThreadData();
#endif
+#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
+ delete [] origArgv;
+#endif
QCoreApplicationPrivate::clearApplicationFilePath();
}
@@ -2194,11 +2202,12 @@ QStringList QCoreApplication::arguments()
}
#endif // Q_OS_WINCE
- if (!self->d_func()->modifiedArgv) {
+ const QCoreApplicationPrivate *d = self->d_func();
+ if (d->origArgv) {
const QStringList allArguments = qWinCmdArgs(cmdline);
- Q_ASSERT(allArguments.size() == __argc);
- for (int i = 0; i < __argc; ++i) {
- if (contains(ac, av, __argv[i]))
+ Q_ASSERT(allArguments.size() == d->origArgc);
+ for (int i = 0; i < d->origArgc; ++i) {
+ if (contains(ac, av, d->origArgv[i]))
list.append(allArguments.at(i));
}
return list;
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 2b03fe2382..463b115f75 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -116,7 +116,8 @@ public:
int &argc;
char **argv;
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
- bool modifiedArgv;
+ int origArgc;
+ char **origArgv; // store unmodified arguments for QCoreApplication::arguments()
#endif
void appendApplicationPathToLibraryPaths(void);