Skip to content

Commit

Permalink
Allocate temporary strings to hold dbus paths on the heap
Browse files Browse the repository at this point in the history
Paths are limited to BUS_PATH_SIZE_MAX but the maximum size is anyway too big
to be allocated on the stack, so let's switch to the heap where there is a
clear way to understand if the allocation fails.
  • Loading branch information
Riccardo Schirone authored and poettering committed Feb 18, 2019
1 parent 61397a6 commit f519a19
Showing 1 changed file with 54 additions and 14 deletions.
68 changes: 54 additions & 14 deletions src/libsystemd/sd-bus/bus-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,8 @@ static int object_manager_serialize_path_and_fallbacks(
const char *path,
sd_bus_error *error) {

char *prefix;
_cleanup_free_ char *prefix = NULL;
size_t pl;
int r;

assert(bus);
Expand All @@ -1149,7 +1150,12 @@ static int object_manager_serialize_path_and_fallbacks(
return 0;

/* Second, add fallback vtables registered for any of the prefixes */
prefix = newa(char, strlen(path) + 1);
pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
r = object_manager_serialize_path(bus, reply, prefix, path, true, error);
if (r < 0)
Expand Down Expand Up @@ -1345,6 +1351,7 @@ static int object_find_and_run(
}

int bus_process_object(sd_bus *bus, sd_bus_message *m) {
_cleanup_free_ char *prefix = NULL;
int r;
size_t pl;
bool found_object = false;
Expand All @@ -1369,9 +1376,12 @@ int bus_process_object(sd_bus *bus, sd_bus_message *m) {
assert(m->member);

pl = strlen(m->path);
do {
char prefix[pl+1];
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

do {
bus->nodes_modified = false;

r = object_find_and_run(bus, m, m->path, false, &found_object);
Expand Down Expand Up @@ -1498,9 +1508,15 @@ static int bus_find_parent_object_manager(sd_bus *bus, struct node **out, const

n = hashmap_get(bus->nodes, path);
if (!n) {
char *prefix;
_cleanup_free_ char *prefix = NULL;
size_t pl;

pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

prefix = newa(char, strlen(path) + 1);
OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
n = hashmap_get(bus->nodes, prefix);
if (n)
Expand Down Expand Up @@ -2083,8 +2099,9 @@ _public_ int sd_bus_emit_properties_changed_strv(
const char *interface,
char **names) {

_cleanup_free_ char *prefix = NULL;
bool found_interface = false;
char *prefix;
size_t pl;
int r;

assert_return(bus, -EINVAL);
Expand All @@ -2105,6 +2122,12 @@ _public_ int sd_bus_emit_properties_changed_strv(

BUS_DONT_DESTROY(bus);

pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

do {
bus->nodes_modified = false;

Expand All @@ -2114,7 +2137,6 @@ _public_ int sd_bus_emit_properties_changed_strv(
if (bus->nodes_modified)
continue;

prefix = newa(char, strlen(path) + 1);
OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
r = emit_properties_changed_on_interface(bus, prefix, path, interface, true, &found_interface, names);
if (r != 0)
Expand Down Expand Up @@ -2246,7 +2268,8 @@ static int object_added_append_all_prefix(

static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
_cleanup_set_free_ Set *s = NULL;
char *prefix;
_cleanup_free_ char *prefix = NULL;
size_t pl;
int r;

assert(bus);
Expand Down Expand Up @@ -2291,7 +2314,12 @@ static int object_added_append_all(sd_bus *bus, sd_bus_message *m, const char *p
if (bus->nodes_modified)
return 0;

prefix = newa(char, strlen(path) + 1);
pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
r = object_added_append_all_prefix(bus, m, s, prefix, path, true);
if (r < 0)
Expand Down Expand Up @@ -2430,7 +2458,8 @@ static int object_removed_append_all_prefix(

static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char *path) {
_cleanup_set_free_ Set *s = NULL;
char *prefix;
_cleanup_free_ char *prefix = NULL;
size_t pl;
int r;

assert(bus);
Expand Down Expand Up @@ -2462,7 +2491,12 @@ static int object_removed_append_all(sd_bus *bus, sd_bus_message *m, const char
if (bus->nodes_modified)
return 0;

prefix = newa(char, strlen(path) + 1);
pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
r = object_removed_append_all_prefix(bus, m, s, prefix, path, true);
if (r < 0)
Expand Down Expand Up @@ -2612,7 +2646,8 @@ static int interfaces_added_append_one(
const char *path,
const char *interface) {

char *prefix;
_cleanup_free_ char *prefix = NULL;
size_t pl;
int r;

assert(bus);
Expand All @@ -2626,7 +2661,12 @@ static int interfaces_added_append_one(
if (bus->nodes_modified)
return 0;

prefix = newa(char, strlen(path) + 1);
pl = strlen(path);
assert(pl <= BUS_PATH_SIZE_MAX);
prefix = new(char, pl + 1);
if (!prefix)
return -ENOMEM;

OBJECT_PATH_FOREACH_PREFIX(prefix, path) {
r = interfaces_added_append_one_prefix(bus, m, prefix, path, interface, true);
if (r != 0)
Expand Down

0 comments on commit f519a19

Please sign in to comment.