manager: enforce limit on accepted number of names

This commit is contained in:
Lennart Poettering
2010-04-22 02:56:42 +02:00
parent c497c7a9e4
commit 4f0f902fc8
3 changed files with 44 additions and 2 deletions
+36 -2
View File
@@ -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 }
};
+3
View File
@@ -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;
+5
View File
@@ -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;