From 7d2c87311e682eabc9b7a3b1e1b4e2f21d0623bf Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 8 Dec 2015 13:50:24 +0100 Subject: QProcessPrivate::startProcess - fix invalid encodedProgramName (OS X) CFBundleCopyExecutableURL returns different URLs (can be absolute or relative) for the same bundle (caching) - and this results in an invalid encodedProgramName (in case we try to start the same process twice), for example, if we start: QProcess p; p.start("nestedDir/nested.app") twice, the second time we'll have an error trying to start something like nestedDir/nested.app/_and_here_absolute_url. Change-Id: I8ac42e20fe3b9fe8b80d5b5c663672e77d88269d Task-number: QTBUG-49837 Reviewed-by: Jake Petroules --- src/corelib/io/qprocess_unix.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index a5488f48cc..8eb5ac9564 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -92,6 +92,7 @@ QT_END_NAMESPACE #include #include #include +#include #include #include #include @@ -362,11 +363,14 @@ void QProcessPrivate::startProcess() static QBasicMutex cfbundleMutex; QMutexLocker lock(&cfbundleMutex); QCFType bundle = CFBundleCreate(0, url); - url = CFBundleCopyExecutableURL(bundle); + // 'executableURL' can be either relative or absolute ... + QCFType executableURL = CFBundleCopyExecutableURL(bundle); + // not to depend on caching - make sure it's always absolute. + url = CFURLCopyAbsoluteURL(executableURL); } if (url) { - QCFString str = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); - encodedProgramName += "/Contents/MacOS/" + QCFString::toQString(str).toUtf8(); + const QCFString str = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); + encodedProgramName += (QDir::separator() + QDir(program).relativeFilePath(QCFString::toQString(str))).toUtf8(); } } #endif -- cgit v1.2.3