summaryrefslogtreecommitdiff
path: root/src/basic/alloc-util.h
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-10-15 12:05:54 +0200
committerLennart Poettering <lennart@poettering.net>2018-10-15 19:35:00 +0200
commit242c41b850af8ebc0c7a0cd44be057e50b5a027a (patch)
tree8cce6c4a26f507d1f1b66da15c267d92017b97a7 /src/basic/alloc-util.h
parent4348c847ccf9758a37ba12ef58171f9a3c7bfb82 (diff)
downloadsystemd-242c41b850af8ebc0c7a0cd44be057e50b5a027a.tar.gz
alloc-util: add alloca() counterparts for memdup() and memdup_suffix0()
Diffstat (limited to 'src/basic/alloc-util.h')
-rw-r--r--src/basic/alloc-util.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/basic/alloc-util.h b/src/basic/alloc-util.h
index ebe42889ea..2a6deb12ca 100644
--- a/src/basic/alloc-util.h
+++ b/src/basic/alloc-util.h
@@ -46,6 +46,21 @@ static inline void *mfree(void *memory) {
void* memdup(const void *p, size_t l) _alloc_(2);
void* memdup_suffix0(const void *p, size_t l) _alloc_(2);
+#define memdupa(p, l) \
+ ({ \
+ void *_q_; \
+ _q_ = alloca(l); \
+ memcpy(_q_, p, l); \
+ })
+
+#define memdupa_suffix0(p, l) \
+ ({ \
+ void *_q_; \
+ _q_ = alloca(l + 1); \
+ ((uint8_t*) _q_)[l] = 0; \
+ memcpy(_q_, p, l); \
+ })
+
static inline void freep(void *p) {
free(*(void**) p);
}