]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
ply-device-manager: Remove simpledrm renderers before adding normal drm renderers
authorHans de Goede <hdegoede@redhat.com>
Wed, 5 Jun 2024 19:52:19 +0000 (21:52 +0200)
committerHans de Goede <hdegoede@redhat.com>
Fri, 7 Jun 2024 15:21:00 +0000 (17:21 +0200)
udev remove events for simpledrm udev devices may arrive after the udev add
event for a normal drm udev device which is replacing the simpledrm device.

When the local_console is managed by a simpledrm renderer and the remove
event for the simpledrm renderer is received after the add event of
the normal drm device, the local_console is left unmanaged breaking legacy
input support.

When this scenario gets hit it breaks entering disk unlock passwords.

Add code to remove simpledrm renderers before adding normal drm renderers
to avoid this.

src/libply-splash-core/ply-device-manager.c

index 65504e937c9543d406d89e3c7435516e38d65e2f..1c9560d7b85eec0d150360c28856d3e134b0421b 100644 (file)
@@ -1080,6 +1080,18 @@ create_text_displays_for_terminal (ply_device_manager_t *manager,
                 manager->text_display_added_handler (manager->event_handler_data, display);
 }
 
+static void
+free_simpledrm_renderer (char                 *device_path,
+                         ply_renderer_t       *renderer,
+                         ply_device_manager_t *manager)
+{
+        if (ply_renderer_get_type (renderer) != PLY_RENDERER_TYPE_SIMPLEDRM)
+                return;
+
+        ply_trace ("removing simpledrm renderer %s", device_path);
+        free_devices_from_device_path (manager, device_path, true);
+}
+
 static bool
 create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                                                const char           *device_path,
@@ -1097,6 +1109,18 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                 return true;
         }
 
+        /*
+         * simpledrm udev remove events may arrive after normal drm device add
+         * events, leaving the local_console unmanaged breaking legacy input.
+         * Remove simpledrm renderers before adding drm renderers to avoid this.
+         */
+        if (renderer_type == PLY_RENDERER_TYPE_DRM) {
+                ply_hashtable_foreach (manager->renderers,
+                                       (ply_hashtable_foreach_func_t *)
+                                       free_simpledrm_renderer,
+                                       manager);
+        }
+
         if (!terminal && !manager->local_console_managed &&
             manager->local_console_terminal != NULL &&
             ply_terminal_is_vt (manager->local_console_terminal))