summaryrefslogtreecommitdiff
path: root/kde-frameworks/ktexteditor/files/ktexteditor-5.90.0-CVE-2022-23853-1.patch
blob: 854cf0da4b2ebe20fef9abe5c0aeff0674e5b1f2 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
From 804e49444c093fe58ec0df2ab436565e50dc147e Mon Sep 17 00:00:00 2001
From: Christoph Cullmann <cullmann@kde.org>
Date: Thu, 20 Jan 2022 09:46:34 +0100
Subject: [PATCH] only start programs in user's path

don't use QProcess with just program name
first search the right program in the user's path
---
 src/document/katedocument.cpp        | 29 ++++++++++++++++------------
 src/swapfile/kateswapdiffcreator.cpp | 17 ++++++++++++----
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/document/katedocument.cpp b/src/document/katedocument.cpp
index 01f74da1..05d0e91b 100644
--- a/src/document/katedocument.cpp
+++ b/src/document/katedocument.cpp
@@ -72,6 +72,7 @@
 #include <QMimeDatabase>
 #include <QProcess>
 #include <QRegularExpression>
+#include <QStandardPaths>
 #include <QTemporaryFile>
 #include <QTextCodec>
 #include <QTextStream>
@@ -5054,18 +5055,22 @@ void KTextEditor::DocumentPrivate::slotDelayedHandleModOnHd()
         // skip that, if document is modified!
         // only do that, if the file is still there, else reload makes no sense!
         if (m_modOnHd && !isModified() && QFile::exists(url().toLocalFile())) {
-            QProcess git;
-            const QStringList args{QStringLiteral("cat-file"), QStringLiteral("-e"), QString::fromUtf8(oldDigest)};
-            git.start(QStringLiteral("git"), args);
-            if (git.waitForStarted()) {
-                git.closeWriteChannel();
-                if (git.waitForFinished()) {
-                    if (git.exitCode() == 0) {
-                        // this hash exists still in git => just reload
-                        m_modOnHd = false;
-                        m_modOnHdReason = OnDiskUnmodified;
-                        m_prevModOnHdReason = OnDiskUnmodified;
-                        documentReload();
+            // we only want to use git from PATH, cache this
+            static const QString fullGitPath = QStandardPaths::findExecutable(QStringLiteral("git"));
+            if (!fullGitPath.isEmpty()) {
+                QProcess git;
+                const QStringList args{QStringLiteral("cat-file"), QStringLiteral("-e"), QString::fromUtf8(oldDigest)};
+                git.start(fullGitPath, args);
+                if (git.waitForStarted()) {
+                    git.closeWriteChannel();
+                    if (git.waitForFinished()) {
+                        if (git.exitCode() == 0) {
+                            // this hash exists still in git => just reload
+                            m_modOnHd = false;
+                            m_modOnHdReason = OnDiskUnmodified;
+                            m_prevModOnHdReason = OnDiskUnmodified;
+                            documentReload();
+                        }
                     }
                 }
             }
diff --git a/src/swapfile/kateswapdiffcreator.cpp b/src/swapfile/kateswapdiffcreator.cpp
index 5c515c45..a185123a 100644
--- a/src/swapfile/kateswapdiffcreator.cpp
+++ b/src/swapfile/kateswapdiffcreator.cpp
@@ -14,6 +14,7 @@
 #include <KMessageBox>
 
 #include <QDir>
+#include <QStandardPaths>
 #include <QTextCodec>
 
 // BEGIN SwapDiffCreator
@@ -85,17 +86,25 @@ void SwapDiffCreator::viewDiff()
     connect(&m_proc, &QProcess::readyRead, this, &SwapDiffCreator::slotDataAvailable, Qt::UniqueConnection);
     connect(&m_proc, &QProcess::finished, this, &SwapDiffCreator::slotDiffFinished, Qt::UniqueConnection);
 
-    // try to start diff process, if we can't be started be done with error
-    m_proc.start(QStringLiteral("diff"), QStringList() << QStringLiteral("-u") << m_originalFile.fileName() << m_recoveredFile.fileName());
-    if (!m_proc.waitForStarted()) {
+    // use diff from PATH only => inform if not found at all
+    const QString fullDiffPath = QStandardPaths::findExecutable(QStringLiteral("diff"));
+    if (fullDiffPath.isEmpty()) {
         KMessageBox::sorry(nullptr,
-                           i18n("The diff command could not be started. Please make sure that "
+                           i18n("The diff command could not be found. Please make sure that "
                                 "diff(1) is installed and in your PATH."),
                            i18n("Error Creating Diff"));
         deleteLater();
         return;
     }
 
+    // try to start the diff program, might fail, too
+    m_proc.start(fullDiffPath, QStringList() << QStringLiteral("-u") << m_originalFile.fileName() << m_recoveredFile.fileName());
+    if (!m_proc.waitForStarted()) {
+        KMessageBox::sorry(nullptr, i18n("The diff command '%1' could not be started.").arg(fullDiffPath), i18n("Error Creating Diff"));
+        deleteLater();
+        return;
+    }
+
     // process is up and running, we can write data to it
     QTextStream ts(&m_proc);
     int lineCount = recoverDoc.lines();
-- 
GitLab