Commit 4f0f902f authored by Lennart Poettering's avatar Lennart Poettering
Browse files

manager: enforce limit on accepted number of names

parent c497c7a9
......@@ -78,8 +78,10 @@
" <property name=\"Version\" type=\"s\" access=\"read\"/>" \
" <property name=\"RunningAs\" type=\"s\" access=\"read\"/>" \
" <property name=\"BootTimestamp\" type=\"t\" access=\"read\"/>" \
" <property name=\"LogLevel\" type=\"s\" access=\"readwrite\"/>" \
" <property name=\"LogTarget\" type=\"s\" access=\"readwrite\"/>" \
" <property name=\"LogLevel\" type=\"s\" access=\"read\"/>" \
" <property name=\"LogTarget\" type=\"s\" access=\"read\"/>" \
" <property name=\"NNames\" type=\"u\" access=\"read\"/>" \
" <property name=\"NJobs\" type=\"u\" access=\"read\"/>" \
" </interface>" \
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 }
};
......
......@@ -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;
......
......@@ -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;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment