Skip to content

Commit 1683342

Browse files
committed
sd-bus: add support for policy upload on activator connections
Activator connections may upload policy when registering to the bus. This patch contains code to translate between BusNamePolicy objects and the kdbus specific items.
1 parent f7c7cd0 commit 1683342

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

src/core/busname.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ static int busname_open_fd(BusName *n) {
233233
if (n->starter_fd >= 0)
234234
return 0;
235235

236-
n->starter_fd = bus_kernel_create_starter(UNIT(n)->manager->running_as == SYSTEMD_SYSTEM ? "system" : "user", n->name);
236+
n->starter_fd = bus_kernel_create_starter(UNIT(n)->manager->running_as == SYSTEMD_SYSTEM ? "system" : "user",
237+
n->name, n->policy);
237238
if (n->starter_fd < 0) {
238239
log_warning_unit(UNIT(n)->id, "Failed to create starter fd: %s", strerror(-n->starter_fd));
239240
return n->starter_fd;

src/libsystemd/sd-bus/bus-kernel.c

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,9 +1338,51 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
13381338
return fd;
13391339
}
13401340

1341-
int bus_kernel_create_starter(const char *bus, const char *name) {
1341+
static void bus_kernel_translate_policy(const BusNamePolicy *policy, struct kdbus_item *item)
1342+
{
1343+
switch (policy->type) {
1344+
case BUSNAME_POLICY_TYPE_USER:
1345+
item->policy_access.type = KDBUS_POLICY_ACCESS_USER;
1346+
item->policy_access.id = policy->uid;
1347+
break;
1348+
1349+
case BUSNAME_POLICY_TYPE_GROUP:
1350+
item->policy_access.type = KDBUS_POLICY_ACCESS_GROUP;
1351+
item->policy_access.id = policy->gid;
1352+
break;
1353+
1354+
case BUSNAME_POLICY_TYPE_WORLD:
1355+
item->policy_access.type = KDBUS_POLICY_ACCESS_WORLD;
1356+
break;
1357+
1358+
default:
1359+
assert_not_reached("Unknown policy type");
1360+
}
1361+
1362+
switch (policy->access) {
1363+
case BUSNAME_POLICY_ACCESS_SEE:
1364+
item->policy_access.access = KDBUS_POLICY_SEE;
1365+
break;
1366+
1367+
case BUSNAME_POLICY_ACCESS_TALK:
1368+
item->policy_access.access = KDBUS_POLICY_TALK;
1369+
break;
1370+
1371+
case BUSNAME_POLICY_ACCESS_OWN:
1372+
item->policy_access.access = KDBUS_POLICY_OWN;
1373+
break;
1374+
1375+
default:
1376+
assert_not_reached("Unknown policy access");
1377+
}
1378+
}
1379+
1380+
int bus_kernel_create_starter(const char *bus, const char *name, BusNamePolicy *policy) {
13421381
struct kdbus_cmd_hello *hello;
13431382
struct kdbus_item *n;
1383+
size_t policy_cnt = 0;
1384+
BusNamePolicy *po;
1385+
size_t size;
13441386
char *p;
13451387
int fd;
13461388

@@ -1354,16 +1396,29 @@ int bus_kernel_create_starter(const char *bus, const char *name) {
13541396
if (fd < 0)
13551397
return -errno;
13561398

1357-
hello = alloca0(ALIGN8(offsetof(struct kdbus_cmd_hello, items) +
1358-
offsetof(struct kdbus_item, str) +
1359-
strlen(name) + 1));
1399+
LIST_FOREACH(policy, po, policy)
1400+
policy_cnt++;
1401+
1402+
size = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
1403+
ALIGN8(offsetof(struct kdbus_item, str) + strlen(name) + 1) +
1404+
policy_cnt * ALIGN8(offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access));
1405+
1406+
hello = alloca0(size);
13601407

13611408
n = hello->items;
13621409
strcpy(n->str, name);
13631410
n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
13641411
n->type = KDBUS_ITEM_NAME;
1412+
n = KDBUS_ITEM_NEXT(n);
1413+
1414+
LIST_FOREACH(policy, po, policy) {
1415+
n->type = KDBUS_ITEM_POLICY_ACCESS;
1416+
n->size = offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access);
1417+
bus_kernel_translate_policy(po, n);
1418+
n = KDBUS_ITEM_NEXT(n);
1419+
}
13651420

1366-
hello->size = ALIGN8(offsetof(struct kdbus_cmd_hello, items) + n->size);
1421+
hello->size = size;
13671422
hello->conn_flags = KDBUS_HELLO_ACTIVATOR;
13681423
hello->pool_size = KDBUS_POOL_SIZE;
13691424

src/libsystemd/sd-bus/bus-kernel.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include <stdbool.h>
2525

26+
#include "busname.h"
2627
#include "sd-bus.h"
2728

2829
#define KDBUS_ITEM_NEXT(item) \
@@ -65,7 +66,7 @@ int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority);
6566

6667
int bus_kernel_create_bus(const char *name, bool world, char **s);
6768
int bus_kernel_create_domain(const char *name, char **s);
68-
int bus_kernel_create_starter(const char *bus, const char *name);
69+
int bus_kernel_create_starter(const char *bus, const char *name, BusNamePolicy *policy);
6970
int bus_kernel_create_monitor(const char *bus);
7071

7172
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated);

0 commit comments

Comments
 (0)