Skip to content

QProcess/Unix: ensure we don't accidentally execute something from CWD

Unless "." (or the empty string) is in $PATH, we're not supposed to find executables in the current directory. This is how the Unix shells behave and we match their behavior. It's also the behavior Qt had prior to 5.9 (commit 28666d16). On Windows, searching the current directory is the norm, so we keep that behavior.

This commit does not add an explicit check for an empty return from QStandardPaths::findExecutable(). Instead, we allow that empty string to go all the way to execve(2), which will fail with ENOENT. We could catch it early, before fork(2), but why add code for the error case?

See https://kde.org/info/security/advisory-20220131-1.txt

[ChangeLog][Important Behavior Changes] When passed a simple program name with no slashes, QProcess on Unix systems will now only search the current directory if "." is one of the entries in the PATH environment variable. This bug fix restores the behavior QProcess had before Qt 5.9. If launching an executable in the directory set by setWorkingDirectory() or inherited from the parent is intended, pass a program name starting with "./". For more information and best practices about finding an executable, see QProcess' documentation.

Pick-to: 5.15 6.2 6.3 Change-Id: I54f205f6b7314351b078fffd16cf7013c97ee9fb Reviewed-by: Qt CI Bot qt_ci_bot@qt-project.org Reviewed-by: Mårten Nordheim marten.nordheim@qt.io Reviewed-by: Thiago Macieira thiago.macieira@intel.com (cherry picked from commit 29fceed2)

Note: This currently breaks various autotests, as they rely on the test helpers (same directory as the test) to be in $PATH. In Qt 6, the CMake test code sets this explicitly, which is not the case in Qt 5 (yet).

Merge request reports