summaryrefslogtreecommitdiff
path: root/kde-frameworks/kio/files/kio-5.80.1-fix-crash-in-ThumbnailProtocol.patch
blob: 059c9f8242418d0665c776b4d289714461ff104a (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 a68cb73c4e071ed24b18a95e11fbbbc8d59840b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?M=C3=A9ven=20Car?= <meven29@gmail.com>
Date: Sun, 21 Mar 2021 05:22:57 +0100
Subject: [PATCH] PreviewJob: Initialize cachesSize with 0, only pass size > 0
 to shmget, improve createThumbnail

BUG: 430862
---
 src/widgets/previewjob.cpp | 48 +++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/src/widgets/previewjob.cpp b/src/widgets/previewjob.cpp
index 988da16b0..9b6e661e8 100644
--- a/src/widgets/previewjob.cpp
+++ b/src/widgets/previewjob.cpp
@@ -70,7 +70,7 @@ public:
         : initialItems(items)
         , width(size.width())
         , height(size.height())
-        , cacheSize(-1)
+        , cacheSize(0)
         , bScale(true)
         , bSave(true)
         , ignoreMaximumSize(false)
@@ -114,8 +114,8 @@ public:
     // Size of thumbnail
     int width;
     int height;
-    // Unscaled size of thumbnail (128 or 256 if cache is enabled)
-    int cacheSize;
+    // Unscaled size of thumbnail (128, 256 or 512 if cache is enabled)
+    ushort cacheSize;
     // Whether the thumbnail should be scaled
     bool bScale;
     // Whether we should save the thumbnail
@@ -712,39 +712,49 @@ void PreviewJobPrivate::createThumbnail(const QString &pixPath)
     });
 
     bool save = bSave && currentItem.plugin->property(QStringLiteral("CacheThumbnail")).toBool() && !sequenceIndex;
+    int thumb_width = width;
+    int thumb_height = height;
+    int thumb_iconSize = iconSize;
+    if (save) {
+        thumb_width = thumb_height = cacheSize;
+        thumb_iconSize = 64;
+    }
+
     job->addMetaData(QStringLiteral("mimeType"), currentItem.item.mimetype());
-    job->addMetaData(QStringLiteral("width"), QString().setNum(save ? cacheSize : width));
-    job->addMetaData(QStringLiteral("height"), QString().setNum(save ? cacheSize : height));
-    job->addMetaData(QStringLiteral("iconSize"), QString().setNum(save ? 64 : iconSize));
-    job->addMetaData(QStringLiteral("iconAlpha"), QString().setNum(iconAlpha));
+    job->addMetaData(QStringLiteral("width"), QString::number(thumb_width));
+    job->addMetaData(QStringLiteral("height"), QString::number(thumb_height));
+    job->addMetaData(QStringLiteral("iconSize"), QString::number(thumb_iconSize));
+    job->addMetaData(QStringLiteral("iconAlpha"), QString::number(iconAlpha));
     job->addMetaData(QStringLiteral("plugin"), currentItem.plugin->library());
     job->addMetaData(QStringLiteral("enabledPlugins"), enabledPlugins.join(QLatin1Char(',')));
     job->addMetaData(QStringLiteral("devicePixelRatio"), QString::number(devicePixelRatio));
     if (sequenceIndex) {
-        job->addMetaData(QStringLiteral("sequence-index"), QString().setNum(sequenceIndex));
+        job->addMetaData(QStringLiteral("sequence-index"), QString::number(sequenceIndex));
     }
 
 #if WITH_SHM
     if (shmid == -1) {
         if (shmaddr) {
+            // clean previous shared memory segment
             shmdt((char *)shmaddr);
             shmctl(shmid, IPC_RMID, nullptr);
+            shmaddr = nullptr;
         }
-        auto size = std::max(cacheSize * cacheSize, width * height);
-        shmid = shmget(IPC_PRIVATE, size * 4 * devicePixelRatio * devicePixelRatio, IPC_CREAT | 0600);
-        if (shmid != -1) {
-            shmaddr = (uchar *)(shmat(shmid, nullptr, SHM_RDONLY));
-            if (shmaddr == (uchar *)-1) {
-                shmctl(shmid, IPC_RMID, nullptr);
-                shmaddr = nullptr;
-                shmid = -1;
+        auto size = thumb_width * thumb_height;
+        if (size > 0) {
+            shmid = shmget(IPC_PRIVATE, size * 4 * devicePixelRatio * devicePixelRatio, IPC_CREAT | 0600);
+            if (shmid != -1) {
+                shmaddr = (uchar *)(shmat(shmid, nullptr, SHM_RDONLY));
+                if (shmaddr == (uchar *)-1) {
+                    shmctl(shmid, IPC_RMID, nullptr);
+                    shmaddr = nullptr;
+                    shmid = -1;
+                }
             }
-        } else {
-            shmaddr = nullptr;
         }
     }
     if (shmid != -1) {
-        job->addMetaData(QStringLiteral("shmid"), QString().setNum(shmid));
+        job->addMetaData(QStringLiteral("shmid"), QString::number(shmid));
     }
 #endif
 }
-- 
GitLab