X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fcore%2Fdbus-execute.c;h=ff5245a0ebc91e6c105949c9858e4682e5be5331;hb=5f8640fb628cb034981e02d741fd9ddf26fdf38d;hp=435c3d505faa3e1e2250c03fc14a462e74d9cd48;hpb=351a19b17d51ba0a5737f35d3c5deb8e7975fdee;p=elogind.git diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c index 435c3d505..ff5245a0e 100644 --- a/src/core/dbus-execute.c +++ b/src/core/dbus-execute.c @@ -21,6 +21,10 @@ #include +#ifdef HAVE_SECCOMP +#include +#endif + #include "bus-util.h" #include "missing.h" #include "ioprio.h" @@ -31,6 +35,10 @@ #include "capability.h" #include "env-util.h" +#ifdef HAVE_SECCOMP +#include "seccomp-util.h" +#endif + BUS_DEFINE_PROPERTY_GET_ENUM(bus_property_get_exec_output, exec_output, ExecOutput); static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_exec_input, exec_input, ExecInput); @@ -349,17 +357,25 @@ static int property_get_syscall_filter( ExecContext *c = userdata; _cleanup_strv_free_ char **l = NULL; - _cleanup_free_ char *t = NULL; + int r; + #ifdef HAVE_SECCOMP Iterator i; void *id; - int r; #endif assert(bus); assert(reply); assert(c); + r = sd_bus_message_open_container(reply, 'r', "bas"); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "b", c->syscall_whitelist); + if (r < 0) + return r; + #ifdef HAVE_SECCOMP SET_FOREACH(id, c->syscall_filter, i) { char *name; @@ -378,22 +394,56 @@ static int property_get_syscall_filter( strv_sort(l); - t = strv_join(l, " "); - if (!t) - return -ENOMEM; + r = sd_bus_message_append_strv(reply, l); + if (r < 0) + return r; - if (!c->syscall_whitelist) { - char *d; + return sd_bus_message_close_container(reply); +} - d = strappend("~", t); - if (!d) - return -ENOMEM; +static int property_get_syscall_archs( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) { + + ExecContext *c = userdata; + _cleanup_strv_free_ char **l = NULL; + int r; - free(t); - t = d; +#ifdef HAVE_SECCOMP + Iterator i; + void *id; +#endif + + assert(bus); + assert(reply); + assert(c); + +#ifdef HAVE_SECCOMP + SET_FOREACH(id, c->syscall_archs, i) { + const char *name; + + name = seccomp_arch_to_string(PTR_TO_UINT32(id) - 1); + if (!name) + continue; + + r = strv_extend(&l, name); + if (r < 0) + return -ENOMEM; } +#endif + + strv_sort(l); + + r = sd_bus_message_append_strv(reply, l); + if (r < 0) + return r; - return sd_bus_message_append(reply, "s", t); + return 0; } static int property_get_syscall_errno( @@ -414,6 +464,24 @@ static int property_get_syscall_errno( return sd_bus_message_append(reply, "i", (int32_t) c->syscall_errno); } +static int property_get_selinux_context( + sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) { + + ExecContext *c = userdata; + + assert(bus); + assert(reply); + assert(c); + + return sd_bus_message_append(reply, "(bs)", c->selinux_context_ignore, c->selinux_context); +} + const sd_bus_vtable bus_exec_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Environment", "as", NULL, offsetof(ExecContext, environment), SD_BUS_VTABLE_PROPERTY_CONST), @@ -473,10 +541,11 @@ const sd_bus_vtable bus_exec_vtable[] = { SD_BUS_PROPERTY("PrivateDevices", "b", bus_property_get_bool, offsetof(ExecContext, private_devices), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SameProcessGroup", "b", bus_property_get_bool, offsetof(ExecContext, same_pgrp), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("UtmpIdentifier", "s", NULL, offsetof(ExecContext, utmp_id), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("SELinuxContext", "s", NULL, offsetof(ExecContext, selinux_context), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("SELinuxContext", "(bs)", property_get_selinux_context, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("IgnoreSIGPIPE", "b", bus_property_get_bool, offsetof(ExecContext, ignore_sigpipe), SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("NoNewPrivileges", "b", bus_property_get_bool, offsetof(ExecContext, no_new_privileges), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("SystemCallFilter", "s", property_get_syscall_filter, 0, SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("SystemCallFilter", "(bas)", property_get_syscall_filter, 0, SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("SystemCallArchitectures", "as", property_get_syscall_archs, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SystemCallErrorNumber", "i", property_get_syscall_errno, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_VTABLE_END };