[libmanette] monitor: Handle only evdev devices in fallback coldplug



commit 0d9e2d56880399f10888d485675f73afa5fc0c79
Author: vanadiae <vanadiae35 gmail com>
Date:   Wed Oct 14 20:41:06 2020 +0200

    monitor: Handle only evdev devices in fallback coldplug
    
    This ensures we read only readable device files starting with event and
    hence handled by evdev, and not other protocols. This avoids writing
    garbage to devices that use another protocol, which could lead to messed
    up input devices.

 src/manette-monitor.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
---
diff --git a/src/manette-monitor.c b/src/manette-monitor.c
index 9ff0e12..8d0268e 100644
--- a/src/manette-monitor.c
+++ b/src/manette-monitor.c
@@ -244,6 +244,19 @@ init_backend (ManetteMonitor *self)
 
 #else /* BACKEND FALLBACK */
 
+/* This eliminates all other files that can be in /dev/input, like js*, mouse*,
+ * by-id/, etc.
+ * There isn't really any need to check if there's only digits after "event", as
+ * it would induce a bit of performance loss for this hypothetical caseā€¦
+ */
+static gboolean
+is_evdev_device (GFile *file)
+{
+  g_autofree char *event_file_basename = g_file_get_basename (file);
+
+  return g_str_has_prefix (event_file_basename, "event");
+}
+
 static gboolean
 is_accessible (GFile *file)
 {
@@ -311,6 +324,9 @@ file_monitor_changed_cb (GFileMonitor      *monitor,
                          GFileMonitorEvent  event_type,
                          ManetteMonitor    *self)
 {
+  if (!is_evdev_device (file))
+    return;
+
   switch (event_type) {
   case G_FILE_MONITOR_EVENT_CREATED:
     file_created (self, file);
@@ -345,8 +361,12 @@ coldplug_devices (ManetteMonitor *self)
 
   while ((name = g_dir_read_name (dir)) != NULL) {
     g_autofree gchar *filename = NULL;
+    g_autoptr (GFile) file = NULL;
+
     filename = g_build_filename (INPUT_DIRECTORY, name, NULL);
-    add_device (self, filename);
+    file = g_file_new_for_path (filename);
+    if (is_evdev_device (file) && is_accessible (file))
+      add_device (self, filename);
   }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]