From b4ca3f45dc5742ad76e8feebd363c490f92b804f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2018 16:21:29 +0900 Subject: [PATCH 1/5] sd-bus: avoid potential memory leaks --- src/libsystemd/sd-bus/sd-bus.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 7e7ebb27a7..58a08d5a4a 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -556,6 +556,7 @@ void bus_set_state(sd_bus *bus, enum bus_state state) { static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) { const char *s; + char *t; sd_bus *bus; int r; @@ -575,10 +576,12 @@ static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *e if (!service_name_is_valid(s) || s[0] != ':') return -EBADMSG; - bus->unique_name = strdup(s); - if (!bus->unique_name) + t = strdup(s); + if (!t) return -ENOMEM; + free_and_replace(bus->unique_name, t); + if (bus->state == BUS_HELLO) { bus_set_state(bus, BUS_RUNNING); @@ -1377,7 +1380,7 @@ fail: int bus_set_address_system_remote(sd_bus *b, const char *host) { _cleanup_free_ char *e = NULL; - char *m = NULL, *c = NULL; + char *m = NULL, *c = NULL, *a; assert(b); assert(host); @@ -1408,10 +1411,12 @@ int bus_set_address_system_remote(sd_bus *b, const char *host) { return -ENOMEM; } - b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c); - if (!b->address) + a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c); + if (!a) return -ENOMEM; + free_and_replace(b->address, a); + return 0; } @@ -1449,6 +1454,7 @@ fail: int bus_set_address_system_machine(sd_bus *b, const char *machine) { _cleanup_free_ char *e = NULL; + char *a; assert(b); assert(machine); @@ -1457,10 +1463,12 @@ int bus_set_address_system_machine(sd_bus *b, const char *machine) { if (!e) return -ENOMEM; - b->address = strjoin("x-machine-unix:machine=", e); - if (!b->address) + a = strjoin("x-machine-unix:machine=", e); + if (!a) return -ENOMEM; + free_and_replace(b->address, a); + return 0; } From cad4fb19c88a27f98fdf900fb28f8841caf826e0 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2018 16:21:51 +0900 Subject: [PATCH 2/5] sd-bus: use free_and_replace() --- src/libsystemd/sd-bus/sd-bus.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 58a08d5a4a..31c79241fc 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -286,8 +286,7 @@ _public_ int sd_bus_set_address(sd_bus *bus, const char *address) { if (!a) return -ENOMEM; - free(bus->address); - bus->address = a; + free_and_replace(bus->address, a); return 0; } @@ -325,10 +324,9 @@ _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) return -ENOMEM; } - free(bus->exec_path); - strv_free(bus->exec_argv); + free_and_replace(bus->exec_path, p); - bus->exec_path = p; + strv_free(bus->exec_argv); bus->exec_argv = a; return 0; @@ -652,8 +650,8 @@ int bus_start_running(sd_bus *bus) { static int parse_address_key(const char **p, const char *key, char **value) { size_t l, n = 0, allocated = 0; + _cleanup_free_ char *r = NULL; const char *a; - char *r = NULL; assert(p); assert(*p); @@ -681,16 +679,12 @@ static int parse_address_key(const char **p, const char *key, char **value) { int x, y; x = unhexchar(a[1]); - if (x < 0) { - free(r); + if (x < 0) return x; - } y = unhexchar(a[2]); - if (y < 0) { - free(r); + if (y < 0) return y; - } c = (char) ((x << 4) | y); a += 3; @@ -717,8 +711,7 @@ static int parse_address_key(const char **p, const char *key, char **value) { *p = a; - free(*value); - *value = r; + free_and_replace(*value, r); return 1; } From e5c8029e137d422dbf2b3565df49b7a1572de43e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2018 16:19:11 +0900 Subject: [PATCH 3/5] sd-bus: explicitly convert int to bool --- src/libsystemd/sd-bus/sd-bus.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 31c79241fc..5bc7ba6607 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -349,7 +349,7 @@ _public_ int sd_bus_set_monitor(sd_bus *bus, int b) { assert_return(bus->state == BUS_UNSET, -EPERM); assert_return(!bus_pid_changed(bus), -ECHILD); - bus->is_monitor = b; + bus->is_monitor = !!b; return 0; } @@ -359,7 +359,7 @@ _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) { assert_return(bus->state == BUS_UNSET, -EPERM); assert_return(!bus_pid_changed(bus), -ECHILD); - bus->accept_fd = b; + bus->accept_fd = !!b; return 0; } @@ -371,7 +371,7 @@ _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) { /* This is not actually supported by any of our transports these days, but we do honour it for synthetic * replies, and maybe one day classic D-Bus learns this too */ - bus->attach_timestamp = b; + bus->attach_timestamp = !!b; return 0; } @@ -455,7 +455,7 @@ _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) { assert_return(bus->state == BUS_UNSET, -EPERM); assert_return(!bus_pid_changed(bus), -ECHILD); - bus->watch_bind = b; + bus->watch_bind = !!b; return 0; } @@ -473,7 +473,7 @@ _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) { assert_return(bus->state == BUS_UNSET, -EPERM); assert_return(!bus_pid_changed(bus), -ECHILD); - bus->connected_signal = b; + bus->connected_signal = !!b; return 0; } From 43beb0cf68ff3efdaa9ce11f540562b91620dcec Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2018 16:33:30 +0900 Subject: [PATCH 4/5] udev: use "#pragma once" --- src/libudev/libudev-private.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h index 76730cc055..565da326f5 100644 --- a/src/libudev/libudev-private.h +++ b/src/libudev/libudev-private.h @@ -1,4 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#pragma once + /*** This file is part of systemd. @@ -18,9 +20,6 @@ along with systemd; If not, see . ***/ -#ifndef _LIBUDEV_PRIVATE_H_ -#define _LIBUDEV_PRIVATE_H_ - #include #include #include @@ -146,5 +145,3 @@ uint64_t util_string_bloom64(const char *str); /* libudev-util-private.c */ int util_resolve_subsys_kernel(struct udev *udev, const char *string, char *result, size_t maxsize, int read_value); - -#endif From f2e18ef1a356c2cba99fdf661c9e5c4fbbeffb73 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Feb 2018 16:36:37 +0900 Subject: [PATCH 5/5] core: remove unnecessary initialization --- src/core/mount.c | 2 +- src/core/service.c | 4 ++-- src/core/swap.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/mount.c b/src/core/mount.c index 76883475a2..914458f8e6 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -709,7 +709,7 @@ static int mount_coldplug(Unit *u) { } static void mount_dump(Unit *u, FILE *f, const char *prefix) { - char buf[FORMAT_TIMESPAN_MAX] = {}; + char buf[FORMAT_TIMESPAN_MAX]; Mount *m = MOUNT(u); MountParameters *p; diff --git a/src/core/service.c b/src/core/service.c index ff0a82864f..9e19fb0216 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -774,8 +774,8 @@ static int service_load(Unit *u) { } static void service_dump(Unit *u, FILE *f, const char *prefix) { - char buf_restart[FORMAT_TIMESPAN_MAX] = {}, buf_start[FORMAT_TIMESPAN_MAX] = {}, buf_stop[FORMAT_TIMESPAN_MAX] = {}; - char buf_runtime[FORMAT_TIMESPAN_MAX] = {}, buf_watchdog[FORMAT_TIMESPAN_MAX] = {}; + char buf_restart[FORMAT_TIMESPAN_MAX], buf_start[FORMAT_TIMESPAN_MAX], buf_stop[FORMAT_TIMESPAN_MAX]; + char buf_runtime[FORMAT_TIMESPAN_MAX], buf_watchdog[FORMAT_TIMESPAN_MAX]; ServiceExecCommand c; Service *s = SERVICE(u); const char *prefix2; diff --git a/src/core/swap.c b/src/core/swap.c index 3b234c2212..fffd8d4627 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -559,7 +559,7 @@ static int swap_coldplug(Unit *u) { } static void swap_dump(Unit *u, FILE *f, const char *prefix) { - char buf[FORMAT_TIMESPAN_MAX] = {}; + char buf[FORMAT_TIMESPAN_MAX]; Swap *s = SWAP(u); SwapParameters *p;