Browse Source

LibGUI: Resolve use-after-free error

Objects taken by reference are no longer valid when used in
`deferred_invoke`. Explicitly copying them solve the issue.
Lucas CHOLLET 2 years ago
parent
commit
a9cc61224d
1 changed files with 1 additions and 1 deletions
  1. 1 1
      Userland/Libraries/LibGUI/FileSystemModel.cpp

+ 1 - 1
Userland/Libraries/LibGUI/FileSystemModel.cpp

@@ -729,7 +729,7 @@ bool FileSystemModel::fetch_thumbnail_for(Node const& node)
     auto const on_error = [path, update_progress](Error error) -> void {
     auto const on_error = [path, update_progress](Error error) -> void {
         // Note: We need to defer that to avoid the function removing its last reference
         // Note: We need to defer that to avoid the function removing its last reference
         //       i.e. trying to destroy itself, which is prohibited.
         //       i.e. trying to destroy itself, which is prohibited.
-        Core::EventLoop::current().deferred_invoke([&] {
+        Core::EventLoop::current().deferred_invoke([path, error = Error::copy(error)]() mutable {
             s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) {
             s_thumbnail_cache.with_locked([path, error = move(error)](auto& cache) {
                 if (error != Error::from_errno(ECANCELED)) {
                 if (error != Error::from_errno(ECANCELED)) {
                     cache.thumbnail_cache.set(path, nullptr);
                     cache.thumbnail_cache.set(path, nullptr);