From 13b6ba97753cabeda9bf25ec4c64502c9bf9aa2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Apr 2026 12:19:40 +0200 Subject: [PATCH 1/2] basic/iovec-wrapper: fix potential memleak on error Also reorder the functions in the call stack order. --- src/basic/iovec-wrapper.c | 22 +++++++++++----------- src/basic/iovec-wrapper.h | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/basic/iovec-wrapper.c b/src/basic/iovec-wrapper.c index 408985763e..bd4b9a1040 100644 --- a/src/basic/iovec-wrapper.c +++ b/src/basic/iovec-wrapper.c @@ -41,17 +41,6 @@ int iovw_put(struct iovec_wrapper *iovw, void *data, size_t len) { return 0; } -int iovw_append(struct iovec_wrapper *iovw, const void *data, size_t len) { - if (len == 0) - return 0; - - void *c = memdup(data, len); - if (!c) - return -ENOMEM; - - return iovw_put(iovw, c, len); -} - int iovw_consume(struct iovec_wrapper *iovw, void *data, size_t len) { /* Move data into iovw or free on error */ int r; @@ -63,6 +52,17 @@ int iovw_consume(struct iovec_wrapper *iovw, void *data, size_t len) { return r; } +int iovw_append(struct iovec_wrapper *iovw, const void *data, size_t len) { + if (len == 0) + return 0; + + void *c = memdup(data, len); + if (!c) + return -ENOMEM; + + return iovw_consume(iovw, c, len); +} + int iovw_put_string_field_full(struct iovec_wrapper *iovw, bool replace, const char *field, const char *value) { _cleanup_free_ char *x = NULL; int r; diff --git a/src/basic/iovec-wrapper.h b/src/basic/iovec-wrapper.h index 6f0c9af43c..eaa859af06 100644 --- a/src/basic/iovec-wrapper.h +++ b/src/basic/iovec-wrapper.h @@ -12,8 +12,8 @@ void iovw_done_free(struct iovec_wrapper *iovw); void iovw_done(struct iovec_wrapper *iovw); int iovw_put(struct iovec_wrapper *iovw, void *data, size_t len); -int iovw_append(struct iovec_wrapper *iovw, const void *data, size_t len); int iovw_consume(struct iovec_wrapper *iovw, void *data, size_t len); +int iovw_append(struct iovec_wrapper *iovw, const void *data, size_t len); static inline bool iovw_isempty(const struct iovec_wrapper *iovw) { return !iovw || iovw->count == 0; From 45c20448d5e1ee751b214e4d79179121801a35cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 17 Apr 2026 12:25:58 +0200 Subject: [PATCH 2/2] basic/iovec-wrapper: use iovw_append in one more place --- src/basic/iovec-wrapper.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/basic/iovec-wrapper.c b/src/basic/iovec-wrapper.c index bd4b9a1040..a4604f9a3c 100644 --- a/src/basic/iovec-wrapper.c +++ b/src/basic/iovec-wrapper.c @@ -126,7 +126,6 @@ size_t iovw_size(const struct iovec_wrapper *iovw) { } int iovw_append_iovw(struct iovec_wrapper *target, const struct iovec_wrapper *source) { - size_t original_count; int r; assert(target); @@ -136,18 +135,10 @@ int iovw_append_iovw(struct iovec_wrapper *target, const struct iovec_wrapper *s if (iovw_isempty(source)) return 0; - original_count = target->count; + size_t original_count = target->count; FOREACH_ARRAY(iovec, source->iovec, source->count) { - void *dup; - - dup = memdup(iovec->iov_base, iovec->iov_len); - if (!dup) { - r = -ENOMEM; - goto rollback; - } - - r = iovw_consume(target, dup, iovec->iov_len); + r = iovw_append(target, iovec->iov_base, iovec->iov_len); if (r < 0) goto rollback; }