summaryrefslogtreecommitdiff
blob: 4b9b8bf581799df4b00a62b00009545d7f015c4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
From 6452a34cf01d03d3167b38bc28a2fe8e13569021 Mon Sep 17 00:00:00 2001
From: Jonathan Marten <jjm@keelhaul.me.uk>
Date: Thu, 14 May 2020 19:17:54 +0100
Subject: Fix service file specifying 'Run in terminal' giving an error code
 100

Happens because KIO::DesktopExecParser::resultingArguments() prepends
the terminal application to the command line.  If this is a relative path,
as it is most likely to be (and will be in the default 'konsole' case),
the "realExecutable" check in KProcessRunner::KProcessRunner() is triggered
and the job aborts with an error.

Expand the specified terminal executable into a full path in resultingArguments(),
and return an error immediately if it cannot be found.  This full terminal path
is not relative for the KProcessRunner::KProcessRunner() check and does not fail.

Check that resultingArguments() is not empty (an error return) before accessing
the first word of the command, so that it does not assert if the list is empty.
Also only call resultingArguments() once.

BUG: 421374
FIXED-IN: 5.71

Differential Revision: https://phabricator.kde.org/D29738
---
 src/core/desktopexecparser.cpp | 10 +++++++++-
 src/gui/kprocessrunner.cpp     | 17 +++++++++--------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/core/desktopexecparser.cpp b/src/core/desktopexecparser.cpp
index a3b5219..fcf83d9 100644
--- a/src/core/desktopexecparser.cpp
+++ b/src/core/desktopexecparser.cpp
@@ -421,7 +421,15 @@ QStringList KIO::DesktopExecParser::resultingArguments() const
     if (d->service.terminal()) {
         KConfigGroup cg(KSharedConfig::openConfig(), "General");
         QString terminal = cg.readPathEntry("TerminalApplication", QStringLiteral("konsole"));
-        if (terminal == QLatin1String("konsole")) {
+        const bool isKonsole = (terminal == QLatin1String("konsole"));
+
+        QString terminalPath = QStandardPaths::findExecutable(terminal);
+        if (terminalPath.isEmpty()) {
+            qCWarning(KIO_CORE) << "Terminal" << terminal << "not found, service" << d->service.name();
+            return QStringList();
+        }
+        terminal = terminalPath;
+        if (isKonsole) {
             if (!d->service.workingDirectory().isEmpty()) {
                 terminal += QLatin1String(" --workdir ") + KShell::quoteArg(d->service.workingDirectory());
             }
diff --git a/src/gui/kprocessrunner.cpp b/src/gui/kprocessrunner.cpp
index a4701a7..cc57b54 100644
--- a/src/gui/kprocessrunner.cpp
+++ b/src/gui/kprocessrunner.cpp
@@ -88,9 +88,17 @@ KProcessRunner::KProcessRunner(const KService::Ptr &service, const QList<QUrl> &
         emitDelayedError(i18n("The desktop entry file\n%1\nis not valid.", service->entryPath()));
         return;
     }
+
     KIO::DesktopExecParser execParser(*service, urls);
+    execParser.setUrlsAreTempFiles(flags & KIO::ApplicationLauncherJob::DeleteTemporaryFiles);
+    execParser.setSuggestedFileName(suggestedFileName);
+    const QStringList args = execParser.resultingArguments();
+    if (args.isEmpty()) {
+        emitDelayedError(i18n("Error processing Exec field in %1", service->entryPath()));
+        return;
+    }
 
-    const QString realExecutable = execParser.resultingArguments().at(0);
+    const QString realExecutable = args.at(0);
     // realExecutable is a full path if DesktopExecParser was able to locate it. Otherwise it's still relative, which is a bad sign.
     if (QDir::isRelativePath(realExecutable) || !QFileInfo(realExecutable).isExecutable()) {
         // Does it really not exist, or is it non-executable? (bug #415567)
@@ -103,13 +111,6 @@ KProcessRunner::KProcessRunner(const KService::Ptr &service, const QList<QUrl> &
         return;
     }
 
-    execParser.setUrlsAreTempFiles(flags & KIO::ApplicationLauncherJob::DeleteTemporaryFiles);
-    execParser.setSuggestedFileName(suggestedFileName);
-    const QStringList args = execParser.resultingArguments();
-    if (args.isEmpty()) {
-        emitDelayedError(i18n("Error processing Exec field in %1", service->entryPath()));
-        return;
-    }
     //qDebug() << "KProcess args=" << args;
     *m_process << args;
 
-- 
cgit v1.1