]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: propagate {zstd,xz,zlib}_load errors
authorEmil Velikov <emil.l.velikov@gmail.com>
Mon, 12 Feb 2024 17:23:07 +0000 (17:23 +0000)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Tue, 30 Apr 2024 17:33:52 +0000 (12:33 -0500)
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.velikov@gmail.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-file.c
libkmod/libkmod-internal.h
libkmod/libkmod-module.c

index 8a0336fec8bb84cd1d9859ceaa2139d305455fce..3a794649b584105fe3557199ace94a5443e99613 100644 (file)
@@ -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)
index 26a7e287f17f82159ba05f943ad4f6c58bc44e0b..3bc6e11d73fdec43d2929024a4bc82663bf167ba 100644 (file)
@@ -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)));
index 585da41a7be7e49e045943c03eae0180e232bb98..1e4348291136c0e6c70b76f0010a56babeabcec1 100644 (file)
@@ -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);