chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core/smack: downgrade info to debug
[elogind.git]
/
src
/
core
/
dbus-manager.c
diff --git
a/src/core/dbus-manager.c
b/src/core/dbus-manager.c
index b7829572f55cab7b409d83e6d066146a17b8c31b..8f4bbc59b786231d04efc368072623a3a6515b3d 100644
(file)
--- a/
src/core/dbus-manager.c
+++ b/
src/core/dbus-manager.c
@@
-36,6
+36,7
@@
#include "path-util.h"
#include "dbus-unit.h"
#include "virt.h"
#include "path-util.h"
#include "dbus-unit.h"
#include "virt.h"
+#include "env-util.h"
#define BUS_MANAGER_INTERFACE_BEGIN \
" <interface name=\"org.freedesktop.systemd1.Manager\">\n"
#define BUS_MANAGER_INTERFACE_BEGIN \
" <interface name=\"org.freedesktop.systemd1.Manager\">\n"
@@
-102,30
+103,31
@@
" <method name=\"ResetFailedUnit\">\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" </method>\n" \
" <method name=\"ResetFailedUnit\">\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" </method>\n" \
- " <method name=\"
GetUnitControlGroupAttributes\">\n"
\
+ " <method name=\"
SetUnitControlGroup\">\n"
\
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
- " <arg name=\"
attributes\" type=\"as\" direction=\"in\"/>\n"
\
- " <arg name=\"
values\" type=\"as\" direction=\"out\"/>\n"
\
+ " <arg name=\"
group\" type=\"s\" direction=\"in\"/>\n"
\
+ " <arg name=\"
mode\" type=\"s\" direction=\"in\"/>\n"
\
" </method>\n" \
" </method>\n" \
- " <method name=\"
SetUnitControlGroupAttributes\">\n"
\
+ " <method name=\"
UnsetUnitControlGroup\">\n"
\
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
- " <arg name=\"
attributes\" type=\"a(sss)\" direction=\"in\"/>\n"
\
+ " <arg name=\"
group\" type=\"s\" direction=\"in\"/>\n"
\
" <arg name=\"mode\" type=\"s\" direction=\"in\"\n/>" \
" </method>\n" \
" <arg name=\"mode\" type=\"s\" direction=\"in\"\n/>" \
" </method>\n" \
- " <method name=\"
UnsetUnitControlGroupAttributes\">\n"
\
+ " <method name=\"
GetUnitControlGroupAttribute\">\n"
\
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
- " <arg name=\"attribute
s\" type=\"a(ss)\" direction=\"in\"/>\n"
\
- " <arg name=\"
mode\" type=\"s\" direction=\"in\"/>\n"
\
+ " <arg name=\"attribute
\" type=\"s\" direction=\"in\"/>\n"
\
+ " <arg name=\"
values\" type=\"as\" direction=\"out\"/>\n"
\
" </method>\n" \
" </method>\n" \
- " <method name=\"SetUnitControlGroup
s\">\n"
\
+ " <method name=\"SetUnitControlGroup
Attribute\">\n"
\
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
- " <arg name=\"groups\" type=\"as\" direction=\"in\"/>\n" \
- " <arg name=\"mode\" type=\"s\" direction=\"in\"/>\n" \
+ " <arg name=\"attribute\" type=\"s\" direction=\"in\"/>\n" \
+ " <arg name=\"values\" type=\"as\" direction=\"in\"/>\n" \
+ " <arg name=\"mode\" type=\"s\" direction=\"in\"\n/>" \
" </method>\n" \
" </method>\n" \
- " <method name=\"UnsetUnitControlGroup
s\">\n"
\
+ " <method name=\"UnsetUnitControlGroup
Attributes\">\n"
\
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"name\" type=\"s\" direction=\"in\"/>\n" \
- " <arg name=\"
groups\" type=\"as\" direction=\"in\"/>\n"
\
- " <arg name=\"mode\" type=\"s\" direction=\"in\"
\n/>
" \
+ " <arg name=\"
attribute\" type=\"s\" direction=\"in\"/>\n"
\
+ " <arg name=\"mode\" type=\"s\" direction=\"in\"
/>\n
" \
" </method>\n" \
" <method name=\"GetJob\">\n" \
" <arg name=\"id\" type=\"u\" direction=\"in\"/>\n" \
" </method>\n" \
" <method name=\"GetJob\">\n" \
" <arg name=\"id\" type=\"u\" direction=\"in\"/>\n" \
@@
-873,7
+875,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
if (!reply)
goto oom;
if (!reply)
goto oom;
- } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetUnitControlGroup
s
")) {
+ } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetUnitControlGroup")) {
const char *name;
Unit *u;
DBusMessageIter iter;
const char *name;
Unit *u;
DBusMessageIter iter;
@@
-901,7
+903,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
if (!reply)
goto oom;
if (!reply)
goto oom;
- } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetUnitControlGroup
s
")) {
+ } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetUnitControlGroup")) {
const char *name;
Unit *u;
DBusMessageIter iter;
const char *name;
Unit *u;
DBusMessageIter iter;
@@
-929,7
+931,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
if (!reply)
goto oom;
if (!reply)
goto oom;
- } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetUnitControlGroupAttribute
s
")) {
+ } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetUnitControlGroupAttribute")) {
const char *name;
Unit *u;
DBusMessageIter iter;
const char *name;
Unit *u;
DBusMessageIter iter;
@@
-948,6
+950,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
}
SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "start");
}
SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "start");
+
r = bus_unit_cgroup_attribute_set(u, &iter);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
r = bus_unit_cgroup_attribute_set(u, &iter);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
@@
-956,7
+959,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
if (!reply)
goto oom;
if (!reply)
goto oom;
- } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetUnitControlGroupAttribute
s
")) {
+ } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetUnitControlGroupAttribute")) {
const char *name;
Unit *u;
DBusMessageIter iter;
const char *name;
Unit *u;
DBusMessageIter iter;
@@
-984,7
+987,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
if (!reply)
goto oom;
if (!reply)
goto oom;
- } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "GetUnitControlGroupAttribute
s
")) {
+ } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "GetUnitControlGroupAttribute")) {
const char *name;
Unit *u;
DBusMessageIter iter;
const char *name;
Unit *u;
DBusMessageIter iter;
@@
-1004,6
+1007,7
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
}
SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "status");
}
SELINUX_UNIT_ACCESS_CHECK(u, connection, message, "status");
+
r = bus_unit_cgroup_attribute_get(u, &iter, &list);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
r = bus_unit_cgroup_attribute_get(u, &iter, &list);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
@@
-1541,7
+1545,8
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
m->exit_code = MANAGER_SWITCH_ROOT;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetEnvironment")) {
m->exit_code = MANAGER_SWITCH_ROOT;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SetEnvironment")) {
- char **l = NULL, **e = NULL;
+ _cleanup_strv_free_ char **l = NULL;
+ char **e = NULL;
SELINUX_ACCESS_CHECK(connection, message, "reboot");
SELINUX_ACCESS_CHECK(connection, message, "reboot");
@@
-1550,9
+1555,10
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
+ if (!strv_env_is_valid(l))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
e = strv_env_merge(2, m->environment, l);
e = strv_env_merge(2, m->environment, l);
- strv_free(l);
if (!e)
goto oom;
if (!e)
goto oom;
@@
-1566,7
+1572,8
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
m->environment = e;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetEnvironment")) {
m->environment = e;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetEnvironment")) {
- char **l = NULL, **e = NULL;
+ _cleanup_strv_free_ char **l = NULL;
+ char **e = NULL;
SELINUX_ACCESS_CHECK(connection, message, "reboot");
SELINUX_ACCESS_CHECK(connection, message, "reboot");
@@
-1575,10
+1582,10
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
+ if (!strv_env_name_or_assignment_is_valid(l))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
e = strv_env_delete(m->environment, 1, l);
e = strv_env_delete(m->environment, 1, l);
- strv_free(l);
-
if (!e)
goto oom;
if (!e)
goto oom;
@@
-1592,7
+1599,8
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
m->environment = e;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetAndSetEnvironment")) {
m->environment = e;
} else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "UnsetAndSetEnvironment")) {
- char **l_set = NULL, **l_unset = NULL, **e = NULL, **f = NULL;
+ _cleanup_strv_free_ char **l_set = NULL, **l_unset = NULL, **e = NULL;
+ char **f = NULL;
DBusMessageIter iter;
SELINUX_ACCESS_CHECK(connection, message, "reboot");
DBusMessageIter iter;
SELINUX_ACCESS_CHECK(connection, message, "reboot");
@@
-1605,33
+1613,25
@@
static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection,
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
goto oom;
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
+ if (!strv_env_name_or_assignment_is_valid(l_unset))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
- if (!dbus_message_iter_next(&iter)) {
- strv_free(l_unset);
+ if (!dbus_message_iter_next(&iter))
return bus_send_error_reply(connection, message, NULL, -EINVAL);
return bus_send_error_reply(connection, message, NULL, -EINVAL);
- }
r = bus_parse_strv_iter(&iter, &l_set);
r = bus_parse_strv_iter(&iter, &l_set);
- if (r < 0) {
- strv_free(l_unset);
- if (r == -ENOMEM)
- goto oom;
-
+ if (r == -ENOMEM)
+ goto oom;
+ if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
return bus_send_error_reply(connection, message, NULL, r);
- }
+ if (!strv_env_is_valid(l_set))
+ return bus_send_error_reply(connection, message, NULL, -EINVAL);
e = strv_env_delete(m->environment, 1, l_unset);
e = strv_env_delete(m->environment, 1, l_unset);
- strv_free(l_unset);
-
- if (!e) {
- strv_free(l_set);
+ if (!e)
goto oom;
goto oom;
- }
f = strv_env_merge(2, e, l_set);
f = strv_env_merge(2, e, l_set);
- strv_free(l_set);
- strv_free(e);
-
if (!f)
goto oom;
if (!f)
goto oom;