]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
device-manager: protect against local console seat getting created more than once
authorRay Strode <rstrode@redhat.com>
Wed, 11 Dec 2013 17:53:38 +0000 (12:53 -0500)
committerRay Strode <rstrode@redhat.com>
Wed, 11 Dec 2013 18:00:02 +0000 (13:00 -0500)
We watch for udev events even after forcing fall back, so we need to
make sure we don't allocate two seats for the local console if we
fallback then get a late event.

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

index 1ad1466d873b43f2ed3cf906fcbdd0d01f13d7cd..c4993c87948efeae1446f0177d13569400af0a7b 100644 (file)
@@ -47,6 +47,7 @@ struct _ply_device_manager
   ply_event_loop_t           *loop;
   ply_hashtable_t            *terminals;
   ply_terminal_t             *local_console_terminal;
+  ply_seat_t                 *local_console_seat;
   ply_list_t                 *seats;
   struct udev                *udev_context;
   struct udev_monitor        *udev_monitor;
@@ -572,6 +573,16 @@ create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                                             ply_renderer_type_t   renderer_type)
 {
   ply_seat_t *seat;
+  bool is_local_terminal = false;
+
+  if (terminal != NULL && manager->local_console_terminal == terminal)
+    is_local_terminal = true;
+
+  if (is_local_terminal && manager->local_console_seat != NULL)
+    {
+      ply_trace ("trying to create seat for local console when one already exists");
+      return;
+    }
 
   ply_trace ("creating seat for %s (renderer type: %u) (terminal: %s)",
              device_path? : "", renderer_type, terminal? ply_terminal_get_name (terminal): "none");
@@ -586,6 +597,9 @@ create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
 
   ply_list_append_data (manager->seats, seat);
 
+  if (is_local_terminal)
+    manager->local_console_seat = seat;
+
   if (manager->seat_added_handler != NULL)
     manager->seat_added_handler (manager->seat_event_handler_data, seat);
 }