placesview: Avoid use-after-free
authorMatthias Clasen <mclasen@redhat.com>
Thu, 11 Feb 2021 14:14:34 +0000 (09:14 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 11 Feb 2021 14:14:34 +0000 (09:14 -0500)
The places view has questionable code for handling
'destroy', which seems to trigger use-after-free in
some cases. Clean this up a bit by acknowledging the
cancellation fully, rather than relying on the
destroyed flag.

gtk/gtkplacesview.c

index aec0ddea609eca1fe7e416e8dfc080f2b10f9bac..4d26337155eac23b0939bcac1030c4c73d994011 100644 (file)
@@ -986,9 +986,14 @@ network_enumeration_next_files_finished (GObject      *source_object,
 
   if (error)
     {
-      if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-        g_warning ("Failed to fetch network locations: %s", error->message);
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        {
+          g_clear_error (&error);
+          g_object_unref (view);
+          return;
+        }
 
+      g_warning ("Failed to fetch network locations: %s", error->message);
       g_clear_error (&error);
     }
   else
@@ -999,16 +1004,11 @@ network_enumeration_next_files_finished (GObject      *source_object,
       g_list_free_full (detected_networks, g_object_unref);
     }
 
-  g_object_unref (view);
+  update_network_state (view);
+  monitor_network (view);
+  update_loading (view);
 
-  /* avoid to update widgets if we are already destroyed
-     (and got cancelled s a result of that) */
-  if (!view->destroyed)
-    {
-      update_network_state (view);
-      monitor_network (view);
-      update_loading (view);
-    }
+  g_object_unref (view);
 }
 
 static void