summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Scott <xeons@users.noreply.github.com>2019-10-01 20:49:10 -0500
committerAndreas Kling <awesomekling@gmail.com>2019-10-03 08:17:41 +0200
commit17597f4681fb7d4e200a021092a351645003f394 (patch)
tree0955c56324ec22f635c9aced2bfabb5affb6fa1a
parent9da121f837df827b639b7c2e227d05556c4f6a68 (diff)
downloadserenity-17597f4681fb7d4e200a021092a351645003f394.zip
LibGUI: Fix GDirectoryModel lifetime bug.
Thumbnail generation callbacks were getting called after the class was already being destroyed causing a crash to occur.
-rw-r--r--Libraries/LibGUI/GDirectoryModel.cpp8
-rw-r--r--Libraries/LibGUI/GDirectoryModel.h3
2 files changed, 9 insertions, 2 deletions
diff --git a/Libraries/LibGUI/GDirectoryModel.cpp b/Libraries/LibGUI/GDirectoryModel.cpp
index 21955a03c5..20c80c4c0f 100644
--- a/Libraries/LibGUI/GDirectoryModel.cpp
+++ b/Libraries/LibGUI/GDirectoryModel.cpp
@@ -126,14 +126,20 @@ bool GDirectoryModel::fetch_thumbnail_for(const Entry& entry)
s_thumbnail_cache.set(path, nullptr);
m_thumbnail_progress_total++;
+ auto directory_model = make_weak_ptr();
+
LibThread::BackgroundAction<RefPtr<GraphicsBitmap>>::create(
[path] {
return render_thumbnail(path);
},
- [this, path](auto thumbnail) {
+ [this, path, directory_model](auto thumbnail) {
s_thumbnail_cache.set(path, move(thumbnail));
+ // class was destroyed, no need to update progress or call any event handlers.
+ if (directory_model.is_null())
+ return;
+
m_thumbnail_progress++;
if (on_thumbnail_progress)
on_thumbnail_progress(m_thumbnail_progress, m_thumbnail_progress_total);
diff --git a/Libraries/LibGUI/GDirectoryModel.h b/Libraries/LibGUI/GDirectoryModel.h
index 5f7ac03049..3a94e5ff2e 100644
--- a/Libraries/LibGUI/GDirectoryModel.h
+++ b/Libraries/LibGUI/GDirectoryModel.h
@@ -5,7 +5,8 @@
#include <LibGUI/GModel.h>
#include <sys/stat.h>
-class GDirectoryModel final : public GModel {
+class GDirectoryModel final : public GModel
+ , public Weakable<GDirectoryModel> {
public:
static NonnullRefPtr<GDirectoryModel> create() { return adopt(*new GDirectoryModel); }
virtual ~GDirectoryModel() override;