bus/dir-watch: Do not crash with > 128 dirs
authorJan Tojnar <jtojnar@gmail.com>
Wed, 20 Apr 2022 09:07:25 +0000 (11:07 +0200)
committerSimon McVittie <smcv@collabora.com>
Mon, 19 Sep 2022 09:47:59 +0000 (10:47 +0100)
Without this running, dbus-daemon with long XDG_DATA_DIRS
will crash on out-of-bounds write:

$ XDG_DATA_DIRS=$(seq  -f "/foo/%g" -s ':' 129) dbus-daemon --session
*** stack smashing detected ***: terminated

(cherry picked from commit b551b3e9737958216a1a9d359150a4110a9d0549)
Backported-from: dbus!302
(cherry picked from commit 9e8fe0718c1abf93e92fcf98c3fe962fc524bfa8)

bus/dir-watch-inotify.c
bus/dir-watch-kqueue.c

index 447dc2d..4f41561 100644 (file)
@@ -108,12 +108,17 @@ _set_watched_dirs_internal (DBusList **directories)
 
   i = 0;
   link = _dbus_list_get_first_link (directories);
-  while (link != NULL)
+  while (link != NULL && i < MAX_DIRS_TO_WATCH)
     {
       new_dirs[i++] = (char *)link->data;
       link = _dbus_list_get_next_link (directories, link);
     }
 
+  if (link != NULL)
+    {
+      _dbus_warn ("Too many directories to watch them all, only watching first %d.", MAX_DIRS_TO_WATCH);
+    }
+
   /* Look for directories in both the old and new sets, if
    * we find one, move its data into the new set.
    */
index 9b1784e..b9f4742 100644 (file)
@@ -218,12 +218,17 @@ bus_set_watched_dirs (BusContext *context, DBusList **directories)
 
   i = 0;
   link = _dbus_list_get_first_link (directories);
-  while (link != NULL)
+  while (link != NULL && i < MAX_DIRS_TO_WATCH)
     {
       new_dirs[i++] = (char *)link->data;
       link = _dbus_list_get_next_link (directories, link);
     }
 
+  if (link != NULL)
+    {
+      _dbus_warn ("Too many directories to watch them all, only watching first %d.", MAX_DIRS_TO_WATCH);
+    }
+
   /* Look for directories in both the old and new sets, if
    * we find one, move its data into the new set.
    */