From: Emil Velikov Date: Mon, 12 Feb 2024 17:23:07 +0000 (+0000) Subject: libkmod: propagate {zstd,xz,zlib}_load errors X-Git-Tag: v33~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=81e5c797d0620ce719dee84a89878b8eca762340;p=thirdparty%2Fkmod.git libkmod: propagate {zstd,xz,zlib}_load errors Propagate any errors during decompression further up the call stack. Without this we could easily pass NULL as mem to init_module(2). Signed-off-by: Emil Velikov Reviewed-by: Lucas De Marchi Signed-off-by: Lucas De Marchi --- diff --git a/libkmod/libkmod-file.c b/libkmod/libkmod-file.c index 8a0336fe..3a794649 100644 --- a/libkmod/libkmod-file.c +++ b/libkmod/libkmod-file.c @@ -381,10 +381,17 @@ static int load_reg(struct kmod_file *file) struct kmod_elf *kmod_file_get_elf(struct kmod_file *file) { + int err; + if (file->elf) return file->elf; - kmod_file_load_contents(file); + err = kmod_file_load_contents(file); + if (err) { + errno = err; + return NULL; + } + file->elf = kmod_elf_new(file->memory, file->size); return file->elf; } @@ -460,13 +467,13 @@ error: /* * Callers should just check file->memory got updated */ -void kmod_file_load_contents(struct kmod_file *file) +int kmod_file_load_contents(struct kmod_file *file) { if (file->memory) - return; + return 0; /* The load functions already log possible errors. */ - file->load(file); + return file->load(file); } void *kmod_file_get_contents(const struct kmod_file *file) diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index 26a7e287..3bc6e11d 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -160,7 +160,7 @@ bool kmod_module_is_builtin(struct kmod_module *mod) __attribute__((nonnull(1))) /* libkmod-file.c */ struct kmod_file *kmod_file_open(const struct kmod_ctx *ctx, const char *filename) _must_check_ __attribute__((nonnull(1,2))); struct kmod_elf *kmod_file_get_elf(struct kmod_file *file) __attribute__((nonnull(1))); -void kmod_file_load_contents(struct kmod_file *file) __attribute__((nonnull(1))); +int kmod_file_load_contents(struct kmod_file *file) __attribute__((nonnull(1))); void *kmod_file_get_contents(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1))); off_t kmod_file_get_size(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1))); enum kmod_file_compression_type kmod_file_get_compression(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1))); diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 585da41a..1e434829 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -903,7 +903,9 @@ static int do_init_module(struct kmod_module *mod, unsigned int flags, off_t size; int err; - kmod_file_load_contents(mod->file); + err = kmod_file_load_contents(mod->file); + if (err) + return err; if (flags & (KMOD_INSERT_FORCE_VERMAGIC | KMOD_INSERT_FORCE_MODVERSION)) { elf = kmod_file_get_elf(mod->file);