mirror of
https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git
synced 2024-12-04 09:13:41 +08:00
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 <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>
This commit is contained in:
parent
ad15892394
commit
81e5c797d0
@ -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)
|
||||
|
@ -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)));
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user