From fb176076e32111dc0c6155d9e66775f94c7ea13d Mon Sep 17 00:00:00 2001 From: Tobias Stoeckmann Date: Sat, 22 Feb 2025 19:53:43 +0100 Subject: [PATCH] libkmod: release memory on builtin error path If the modules.builtin.modinfo file contains valid and invalid lines, it is possible that libkmod leaks memory on error path. Let strbuf API take care to always release strbuf and reset it if allocated heap memory is taken away from it. Signed-off-by: Tobias Stoeckmann Link: https://github.com/kmod-project/kmod/pull/291 Signed-off-by: Lucas De Marchi (cherry picked from commit 51929659b2faad1288bea9502cb5a672ca15abff) --- libkmod/libkmod-builtin.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libkmod/libkmod-builtin.c b/libkmod/libkmod-builtin.c index 293ea894..f354d455 100644 --- a/libkmod/libkmod-builtin.c +++ b/libkmod/libkmod-builtin.c @@ -150,9 +150,10 @@ static char **strbuf_to_vector(struct strbuf *buf, size_t count) vector = realloc(buf->bytes, total_size); if (vector == NULL) return NULL; - buf->bytes = NULL; + memmove(vector + count + 1, vector, strbuf_used(buf)); s = (char *)(vector + count + 1); + strbuf_init(buf); for (n = 0; n < count; n++) { vector[n] = s; @@ -167,13 +168,12 @@ static char **strbuf_to_vector(struct strbuf *buf, size_t count) ssize_t kmod_builtin_get_modinfo(struct kmod_ctx *ctx, const char *modname, char ***modinfo) { + DECLARE_STRBUF(buf); struct kmod_builtin_info info; - struct strbuf buf; ssize_t count; if (!kmod_builtin_info_init(&info, ctx)) return -errno; - strbuf_init(&buf); count = get_strings(&info, modname, &buf); if (count == 0) @@ -183,7 +183,6 @@ ssize_t kmod_builtin_get_modinfo(struct kmod_ctx *ctx, const char *modname, if (*modinfo == NULL) { count = -errno; ERR(ctx, "strbuf_to_vector: %s\n", strerror(errno)); - strbuf_release(&buf); } } -- 2.47.2