On Mon, Feb 12, 2024 at 05:23:07PM GMT, Emil Velikov via B4 Relay wrote:
From: Emil Velikov <emil.l.veli...@gmail.com>

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 <emil.l.veli...@gmail.com>


Reviewed-by: Lucas De Marchi <lucas.demar...@intel.com>

thanks
Lucas De Marchi

---
libkmod/libkmod-file.c     | 15 +++++++++++----
libkmod/libkmod-internal.h |  2 +-
libkmod/libkmod-module.c   |  4 +++-
3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/libkmod/libkmod-file.c b/libkmod/libkmod-file.c
index 8a0336f..3a79464 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 26a7e28..3bc6e11 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 585da41..1e43482 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);

--
2.43.0


Reply via email to