]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: return the errno from kmod_elf_new()
authorEmil Velikov <emil.l.velikov@gmail.com>
Wed, 7 May 2025 17:58:11 +0000 (18:58 +0100)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Tue, 20 May 2025 02:51:44 +0000 (21:51 -0500)
Rework the function signature and return the error code instead of the
stripped module. Thus we no longer explicitly set errno.

Reference: https://github.com/kmod-project/kmod/issues/244
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Link: https://github.com/kmod-project/kmod/pull/346
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-elf.c
libkmod/libkmod-file.c
libkmod/libkmod-internal.h
testsuite/init_module.c

index 9b2ceca77f61e1ddc18c4ec95138123f5840e6e6..0fc95348d8c6dc4df6f24ab53afb98f86a410018 100644 (file)
@@ -305,7 +305,7 @@ static void kmod_elf_save_sections(struct kmod_elf *elf)
        }
 }
 
-struct kmod_elf *kmod_elf_new(const void *memory, off_t size)
+int kmod_elf_new(const void *memory, off_t size, struct kmod_elf **out_elf)
 {
        struct kmod_elf *elf;
        size_t shdrs_size, shdr_size;
@@ -318,15 +318,13 @@ struct kmod_elf *kmod_elf_new(const void *memory, off_t size)
        assert_cc(sizeof(uint32_t) == sizeof(Elf64_Word));
 
        elf = malloc(sizeof(struct kmod_elf));
-       if (elf == NULL) {
-               return NULL;
-       }
+       if (elf == NULL)
+               return -ENOMEM;
 
        err = elf_identify(elf, memory, size);
        if (err < 0) {
                free(elf);
-               errno = -err;
-               return NULL;
+               return err;
        }
 
        elf->memory = memory;
@@ -388,12 +386,12 @@ struct kmod_elf *kmod_elf_new(const void *memory, off_t size)
        }
 
        kmod_elf_save_sections(elf);
-       return elf;
+       *out_elf = elf;
+       return 0;
 
 invalid:
        free(elf);
-       errno = EINVAL;
-       return NULL;
+       return -EINVAL;
 }
 
 void kmod_elf_unref(struct kmod_elf *elf)
index 0eeb00a42c2ed698e7e982634bb364d66c07c7ab..23057fa6e12e4de46247b332c37ad21a994c146f 100644 (file)
@@ -71,7 +71,11 @@ struct kmod_elf *kmod_file_get_elf(struct kmod_file *file)
                return NULL;
        }
 
-       file->elf = kmod_elf_new(file->memory, file->size);
+       err = kmod_elf_new(file->memory, file->size, &file->elf);
+       if (err) {
+               errno = -err;
+               return NULL;
+       }
        return file->elf;
 }
 
index be26e0d293742761b519ec214ec880ae1397dd04..17e6e5f5a2d8c9fadfa6ba62d1494efb4671e60c 100644 (file)
@@ -152,7 +152,7 @@ struct kmod_modversion {
        const char *symbol;
 };
 
-_nonnull_all_ struct kmod_elf *kmod_elf_new(const void *memory, off_t size);
+_must_check_ _nonnull_all_ int kmod_elf_new(const void *memory, off_t size, struct kmod_elf **elf);
 _nonnull_all_ void kmod_elf_unref(struct kmod_elf *elf);
 _must_check_ _nonnull_all_ const void *kmod_elf_get_memory(const struct kmod_elf *elf);
 _must_check_ _nonnull_all_ int kmod_elf_get_modinfo_strings(const struct kmod_elf *elf, char ***array);
index ccb43b0c7c67c26bc2a562836b06e0096d9d3498..35630d89b23ab369155d1d34e2d9104577b9b43c 100644 (file)
@@ -239,9 +239,11 @@ long init_module(void *mem, unsigned long len, const char *args)
                return -1;
        }
 
-       elf = kmod_elf_new(mem, len);
-       if (elf == NULL)
+       err = kmod_elf_new(mem, len, &elf);
+       if (err < 0) {
+               errno = -err;
                return -1;
+       }
 
        err = kmod_elf_get_section(elf, ".gnu.linkonce.this_module", &off, &bufsize);
        buf = (const char *)kmod_elf_get_memory(elf) + off;