summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-04-14 17:43:59 +0200
committerLennart Poettering <lennart@poettering.net>2013-04-14 17:43:59 +0200
commited5c5dbde1575d74c87ae9856fe61268d7ae8f4b (patch)
treef9cf03c29268df9b37e7f1cfd455752f8ef3ca74
parent01f6c9d4685edbc38c8df9175286f0e312dc1938 (diff)
util: introduce alloca0() and use it at a number of places
-rw-r--r--src/libsystemd-bus/bus-control.c7
-rw-r--r--src/libsystemd-bus/bus-kernel.c3
-rw-r--r--src/shared/util.h8
3 files changed, 11 insertions, 7 deletions
diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c
index 5296029fd6..e980bfc740 100644
--- a/src/libsystemd-bus/bus-control.c
+++ b/src/libsystemd-bus/bus-control.c
@@ -66,10 +66,9 @@ int sd_bus_request_name(sd_bus *bus, const char *name, int flags) {
size_t l;
l = strlen(name);
- n = alloca(offsetof(struct kdbus_cmd_name, name) + l + 1);
+ n = alloca0(offsetof(struct kdbus_cmd_name, name) + l + 1);
n->size = offsetof(struct kdbus_cmd_name, name) + l + 1;
n->name_flags = flags;
- n->id = 0;
memcpy(n->name, name, l+1);
#ifdef HAVE_VALGRIND_MEMCHECK_H
@@ -121,10 +120,8 @@ int sd_bus_release_name(sd_bus *bus, const char *name) {
size_t l;
l = strlen(name);
- n = alloca(offsetof(struct kdbus_cmd_name, name) + l + 1);
+ n = alloca0(offsetof(struct kdbus_cmd_name, name) + l + 1);
n->size = offsetof(struct kdbus_cmd_name, name) + l + 1;
- n->name_flags = 0;
- n->id = 0;
memcpy(n->name, name, l+1);
#ifdef HAVE_VALGRIND_MEMCHECK_H
diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c
index b2d98c05d7..264c6994d9 100644
--- a/src/libsystemd-bus/bus-kernel.c
+++ b/src/libsystemd-bus/bus-kernel.c
@@ -474,8 +474,7 @@ int bus_kernel_create(const char *name, char **s) {
return -errno;
l = strlen(name);
- make = alloca(offsetof(struct kdbus_cmd_bus_make, name) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1);
- memset(make, 0, offsetof(struct kdbus_cmd_bus_make, name));
+ make = alloca0(offsetof(struct kdbus_cmd_bus_make, name) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1);
sprintf(make->name, "%lu-%s", (unsigned long) getuid(), name);
make->size = offsetof(struct kdbus_cmd_bus_make, name) + strlen(make->name) + 1;
make->flags = KDBUS_ACCESS_WORLD | KDBUS_POLICY_OPEN;
diff --git a/src/shared/util.h b/src/shared/util.h
index ad9753655a..b33fdb5b7a 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -657,3 +657,11 @@ static inline unsigned decimal_str_max(unsigned x) {
}
int unlink_noerrno(const char *path);
+
+#define alloca0(n) \
+ ({ \
+ char *__new; \
+ size_t __len = n; \
+ __new = alloca(__len); \
+ (void *) memset(__new, 0, __len); \
+ })