Blame SOURCES/0001-boot-splash-handle-update-coming-in-after-splash-is-.patch

0ee6e3
From 4cb71a45b448dd8008242a5de122771c4e6d1c36 Mon Sep 17 00:00:00 2001
0ee6e3
From: rpm-build <rpm-build>
0ee6e3
Date: Thu, 29 Aug 2019 09:21:57 -0400
0ee6e3
Subject: [PATCH] boot-splash: handle update coming in after splash is unloaded
0ee6e3
0ee6e3
In some scenario i don't quite understand, involving plymouthd
0ee6e3
getting updated while it's running, the boot splash can get unloaded
0ee6e3
while its progress timeout remains active, leading to crash.
0ee6e3
0ee6e3
This commit protects against such a crash.
0ee6e3
---
0ee6e3
 src/libply-splash-core/ply-boot-splash.c | 21 +++++++++++++--------
0ee6e3
 1 file changed, 13 insertions(+), 8 deletions(-)
0ee6e3
0ee6e3
diff --git a/src/libply-splash-core/ply-boot-splash.c b/src/libply-splash-core/ply-boot-splash.c
0ee6e3
index 664acc3..267136a 100644
0ee6e3
--- a/src/libply-splash-core/ply-boot-splash.c
0ee6e3
+++ b/src/libply-splash-core/ply-boot-splash.c
0ee6e3
@@ -412,75 +412,80 @@ ply_boot_splash_free (ply_boot_splash_t *splash)
0ee6e3
 
0ee6e3
   if (splash->module_handle != NULL)
0ee6e3
     {
0ee6e3
       ply_boot_splash_unset_keyboard (splash);
0ee6e3
 
0ee6e3
       remove_pixel_displays (splash);
0ee6e3
       ply_list_free (splash->pixel_displays);
0ee6e3
 
0ee6e3
       remove_text_displays (splash);
0ee6e3
       ply_list_free (splash->text_displays);
0ee6e3
 
0ee6e3
       ply_boot_splash_unload (splash);
0ee6e3
     }
0ee6e3
 
0ee6e3
   if (splash->idle_trigger != NULL)
0ee6e3
     ply_trigger_free (splash->idle_trigger);
0ee6e3
 
0ee6e3
   free (splash->theme_path);
0ee6e3
   free (splash->plugin_dir);
0ee6e3
   free (splash);
0ee6e3
 }
0ee6e3
 
0ee6e3
 static void
0ee6e3
 ply_boot_splash_update_progress (ply_boot_splash_t *splash)
0ee6e3
 {
0ee6e3
   double percentage=0.0;
0ee6e3
   double time=0.0;
0ee6e3
 
0ee6e3
   assert (splash != NULL);
0ee6e3
 
0ee6e3
+  if (splash->plugin_interface == NULL)
0ee6e3
+    return;
0ee6e3
+
0ee6e3
   if (splash->progress)
0ee6e3
     {
0ee6e3
       percentage = ply_progress_get_percentage(splash->progress);
0ee6e3
       time = ply_progress_get_time(splash->progress);
0ee6e3
     }
0ee6e3
 
0ee6e3
   if (splash->plugin_interface->on_boot_progress != NULL)
0ee6e3
-    splash->plugin_interface->on_boot_progress (splash->plugin,
0ee6e3
-                                                time,
0ee6e3
-                                                percentage);
0ee6e3
-
0ee6e3
-  ply_event_loop_watch_for_timeout (splash->loop,
0ee6e3
-                                   1.0 / UPDATES_PER_SECOND,
0ee6e3
-                                   (ply_event_loop_timeout_handler_t)
0ee6e3
-                                   ply_boot_splash_update_progress, splash);
0ee6e3
+    {
0ee6e3
+      splash->plugin_interface->on_boot_progress (splash->plugin,
0ee6e3
+                                                  time,
0ee6e3
+                                                  percentage);
0ee6e3
+
0ee6e3
+      ply_event_loop_watch_for_timeout (splash->loop,
0ee6e3
+                                        1.0 / UPDATES_PER_SECOND,
0ee6e3
+                                        (ply_event_loop_timeout_handler_t)
0ee6e3
+                                        ply_boot_splash_update_progress, splash);
0ee6e3
+    }
0ee6e3
 }
0ee6e3
 
0ee6e3
 void
0ee6e3
 ply_boot_splash_attach_progress (ply_boot_splash_t *splash,
0ee6e3
                                       ply_progress_t    *progress)
0ee6e3
 {
0ee6e3
   assert (splash != NULL);
0ee6e3
   assert (progress != NULL);
0ee6e3
   assert (splash->progress == NULL);
0ee6e3
   splash->progress = progress;
0ee6e3
 }
0ee6e3
 
0ee6e3
 
0ee6e3
 bool
0ee6e3
 ply_boot_splash_show (ply_boot_splash_t *splash,
0ee6e3
                       ply_boot_splash_mode_t mode)
0ee6e3
 {
0ee6e3
   assert (splash != NULL);
0ee6e3
   assert (mode != PLY_BOOT_SPLASH_MODE_INVALID);
0ee6e3
   assert (splash->module_handle != NULL);
0ee6e3
   assert (splash->loop != NULL);
0ee6e3
   assert (splash->plugin_interface != NULL);
0ee6e3
   assert (splash->plugin != NULL);
0ee6e3
   assert (splash->plugin_interface->show_splash_screen != NULL);
0ee6e3
 
0ee6e3
   if (splash->mode == mode)
0ee6e3
     {
0ee6e3
       ply_trace ("already set same splash screen mode");
0ee6e3
       return true;
0ee6e3
     }
0ee6e3
-- 
0ee6e3
2.21.0
0ee6e3