From: Jan Tojnar Date: Wed, 20 Apr 2022 09:07:25 +0000 (+0200) Subject: bus/dir-watch: Do not crash with > 128 dirs X-Git-Tag: dbus-1.12.24~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fd9680e1318977bb6d33a89cebbc8b8a3b66ae4;p=thirdparty%2Fdbus.git bus/dir-watch: Do not crash with > 128 dirs 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) --- diff --git a/bus/dir-watch-inotify.c b/bus/dir-watch-inotify.c index 447dc2dba..4f415618e 100644 --- a/bus/dir-watch-inotify.c +++ b/bus/dir-watch-inotify.c @@ -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. */ diff --git a/bus/dir-watch-kqueue.c b/bus/dir-watch-kqueue.c index 9b1784e8a..b9f4742a9 100644 --- a/bus/dir-watch-kqueue.c +++ b/bus/dir-watch-kqueue.c @@ -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. */