From 51929659b2faad1288bea9502cb5a672ca15abff 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 --- 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.3