From: Zbigniew Jędrzejewski-Szmek Date: Fri, 17 Apr 2026 10:19:40 +0000 (+0200) Subject: basic/iovec-wrapper: fix potential memleak on error X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=13b6ba97753cabeda9bf25ec4c64502c9bf9aa2c;p=thirdparty%2Fsystemd.git basic/iovec-wrapper: fix potential memleak on error Also reorder the functions in the call stack order. --- diff --git a/src/basic/iovec-wrapper.c b/src/basic/iovec-wrapper.c index 408985763ea..bd4b9a10402 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 6f0c9af43c9..eaa859af06d 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;