From 4f0f902fc8837999e5c9f3a6f7e2592cc6f096eb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 22 Apr 2010 02:56:42 +0200 Subject: [PATCH] manager: enforce limit on accepted number of names --- dbus-manager.c | 38 ++++++++++++++++++++++++++++++++++++-- manager.h | 3 +++ unit.c | 5 +++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/dbus-manager.c b/dbus-manager.c index 92632481..47fb403f 100644 --- a/dbus-manager.c +++ b/dbus-manager.c @@ -78,8 +78,10 @@ " " \ " " \ " " \ - " " \ - " " \ + " " \ + " " \ + " " \ + " " \ " " \ BUS_PROPERTIES_INTERFACE \ BUS_INTROSPECTABLE_INTERFACE @@ -119,6 +121,36 @@ static int bus_manager_append_log_level(Manager *m, DBusMessageIter *i, const ch return 0; } +static int bus_manager_append_n_names(Manager *m, DBusMessageIter *i, const char *property, void *data) { + uint32_t u; + + assert(m); + assert(i); + assert(property); + + u = hashmap_size(m->units); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, &u)) + return -ENOMEM; + + return 0; +} + +static int bus_manager_append_n_jobs(Manager *m, DBusMessageIter *i, const char *property, void *data) { + uint32_t u; + + assert(m); + assert(i); + assert(property); + + u = hashmap_size(m->jobs); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, &u)) + return -ENOMEM; + + return 0; +} + static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, DBusMessage *message, void *data) { Manager *m = data; @@ -128,6 +160,8 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection { "org.freedesktop.systemd1.Manager", "BootTimestamp", bus_property_append_uint64, "t", &m->boot_timestamp }, { "org.freedesktop.systemd1.Manager", "LogLevel", bus_manager_append_log_level, "s", NULL }, { "org.freedesktop.systemd1.Manager", "LogTarget", bus_manager_append_log_target, "s", NULL }, + { "org.freedesktop.systemd1.Manager", "NNames", bus_manager_append_n_names, "u", NULL }, + { "org.freedesktop.systemd1.Manager", "NJobs", bus_manager_append_n_jobs, "u", NULL }, { NULL, NULL, NULL, NULL, NULL } }; diff --git a/manager.h b/manager.h index bd0c82ee..01490fc1 100644 --- a/manager.h +++ b/manager.h @@ -29,6 +29,9 @@ #include "fdset.h" +/* Enforce upper limit how many names we allow */ +#define MANAGER_MAX_NAMES 2048 + typedef struct Manager Manager; typedef enum WatchType WatchType; typedef struct Watch Watch; diff --git a/unit.c b/unit.c index 5c19b3b2..3f2538a6 100644 --- a/unit.c +++ b/unit.c @@ -125,6 +125,11 @@ int unit_add_name(Unit *u, const char *text) { goto fail; } + if (hashmap_size(u->meta.manager->units) >= MANAGER_MAX_NAMES) { + r = -E2BIG; + goto fail; + } + if ((r = set_put(u->meta.names, s)) < 0) { if (r == -EEXIST) r = 0; -- 2.39.5