mirror of
https://github.com/systemd/systemd.git
synced 2025-03-13 00:58:27 +03:00
bus-proxy: fix compat with autostarted services
This commit is contained in:
parent
4e7dff9b09
commit
0aa72be6a0
@ -45,6 +45,7 @@
|
||||
#include "def.h"
|
||||
#include "capability.h"
|
||||
#include "bus-policy.h"
|
||||
#include "bus-control.h"
|
||||
|
||||
static char *arg_address = NULL;
|
||||
static char *arg_command_line_buffer = NULL;
|
||||
@ -1002,7 +1003,7 @@ static int process_policy(sd_bus *from, sd_bus *to, sd_bus_message *m, Policy *p
|
||||
}
|
||||
|
||||
if (granted) {
|
||||
/* Then check whether us, the recipient can recieve from the sender's name */
|
||||
/* Then check whether us (the recipient) can recieve from the sender's name */
|
||||
if (strv_isempty(sender_names)) {
|
||||
if (policy_check_recv(policy, our_ucred->uid, our_ucred->gid, m->header->type, NULL, m->path, m->interface, m->member))
|
||||
return 0;
|
||||
@ -1038,9 +1039,10 @@ static int process_policy(sd_bus *from, sd_bus *to, sd_bus_message *m, Policy *p
|
||||
|
||||
/* The message came from the legacy client, and is sent to kdbus. */
|
||||
if (m->destination) {
|
||||
r = sd_bus_get_name_creds(to, m->destination,
|
||||
SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME|
|
||||
SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID, &destination_creds);
|
||||
r = bus_get_name_creds_kdbus(to, m->destination,
|
||||
SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME|
|
||||
SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID,
|
||||
true, &destination_creds);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@ -1056,7 +1058,7 @@ static int process_policy(sd_bus *from, sd_bus *to, sd_bus_message *m, Policy *p
|
||||
(void) sd_bus_creds_get_gid(destination_creds, &destination_gid);
|
||||
}
|
||||
|
||||
/* First check if we, the sender can send to this name */
|
||||
/* First check if we (the sender) can send to this name */
|
||||
if (strv_isempty(destination_names)) {
|
||||
if (policy_check_send(policy, our_ucred->uid, our_ucred->gid, m->header->type, NULL, m->path, m->interface, m->member))
|
||||
granted = true;
|
||||
|
@ -600,10 +600,11 @@ static int bus_populate_creds_from_items(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bus_get_name_creds_kdbus(
|
||||
int bus_get_name_creds_kdbus(
|
||||
sd_bus *bus,
|
||||
const char *name,
|
||||
uint64_t mask,
|
||||
bool allow_activator,
|
||||
sd_bus_creds **creds) {
|
||||
|
||||
_cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
|
||||
@ -652,7 +653,7 @@ static int bus_get_name_creds_kdbus(
|
||||
conn_info = (struct kdbus_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
|
||||
|
||||
/* Non-activated names are considered not available */
|
||||
if (conn_info->flags & KDBUS_HELLO_ACTIVATOR) {
|
||||
if (!allow_activator && (conn_info->flags & KDBUS_HELLO_ACTIVATOR)) {
|
||||
if (name[0] == ':')
|
||||
r = -ENXIO;
|
||||
else
|
||||
@ -875,7 +876,7 @@ _public_ int sd_bus_get_name_creds(
|
||||
return -ENOTCONN;
|
||||
|
||||
if (bus->is_kernel)
|
||||
return bus_get_name_creds_kdbus(bus, name, mask, creds);
|
||||
return bus_get_name_creds_kdbus(bus, name, mask, false, creds);
|
||||
else
|
||||
return bus_get_name_creds_dbus1(bus, name, mask, creds);
|
||||
}
|
||||
|
@ -29,3 +29,5 @@ int bus_remove_match_internal(sd_bus *bus, const char *match, uint64_t cookie);
|
||||
|
||||
int bus_add_match_internal_kernel(sd_bus *bus, struct bus_match_component *components, unsigned n_components, uint64_t cookie);
|
||||
int bus_remove_match_internal_kernel(sd_bus *bus, uint64_t cookie);
|
||||
|
||||
int bus_get_name_creds_kdbus(sd_bus *bus, const char *name, uint64_t mask, bool allow_activator, sd_bus_creds **creds);
|
||||
|
Loading…
x
Reference in New Issue
Block a user