~registry/kmod/master

« back to all changes in this revision

Viewing changes to libkmod/libkmod-module.c

  • Committer: Lucas De Marchi
  • Date: 2023-06-09 17:45:55 UTC
  • Revision ID: git-v1:e1f0e169de5413139c378c188028ae147d0b73ae
libkmod: Extract finit_module vs init_module paths

Extract 2 functions to handle finit_module vs init_modules differences,
with a fallback from the former to the latter.

Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
861
861
 
862
862
extern long init_module(const void *mem, unsigned long len, const char *args);
863
863
 
 
864
static int do_finit_module(struct kmod_module *mod, unsigned int flags,
 
865
                           const char *args)
 
866
{
 
867
        unsigned int kernel_flags = 0;
 
868
        int err;
 
869
 
 
870
        /*
 
871
         * Re-use ENOSYS, returned when there is no such syscall, so the
 
872
         * fallback to init_module applies
 
873
         */
 
874
        if (!kmod_file_get_direct(mod->file))
 
875
                return -ENOSYS;
 
876
 
 
877
        if (flags & KMOD_INSERT_FORCE_VERMAGIC)
 
878
                kernel_flags |= MODULE_INIT_IGNORE_VERMAGIC;
 
879
        if (flags & KMOD_INSERT_FORCE_MODVERSION)
 
880
                kernel_flags |= MODULE_INIT_IGNORE_MODVERSIONS;
 
881
 
 
882
        err = finit_module(kmod_file_get_fd(mod->file), args, kernel_flags);
 
883
        if (err < 0)
 
884
                err = -errno;
 
885
 
 
886
        return err;
 
887
}
 
888
 
 
889
static int do_init_module(struct kmod_module *mod, unsigned int flags,
 
890
                          const char *args)
 
891
{
 
892
        struct kmod_elf *elf;
 
893
        const void *mem;
 
894
        off_t size;
 
895
        int err;
 
896
 
 
897
        kmod_file_load_contents(mod->file);
 
898
 
 
899
        if (flags & (KMOD_INSERT_FORCE_VERMAGIC | KMOD_INSERT_FORCE_MODVERSION)) {
 
900
                elf = kmod_file_get_elf(mod->file);
 
901
                if (elf == NULL) {
 
902
                        err = -errno;
 
903
                        return err;
 
904
                }
 
905
 
 
906
                if (flags & KMOD_INSERT_FORCE_MODVERSION) {
 
907
                        err = kmod_elf_strip_section(elf, "__versions");
 
908
                        if (err < 0)
 
909
                                INFO(mod->ctx, "Failed to strip modversion: %s\n", strerror(-err));
 
910
                }
 
911
 
 
912
                if (flags & KMOD_INSERT_FORCE_VERMAGIC) {
 
913
                        err = kmod_elf_strip_vermagic(elf);
 
914
                        if (err < 0)
 
915
                                INFO(mod->ctx, "Failed to strip vermagic: %s\n", strerror(-err));
 
916
                }
 
917
 
 
918
                mem = kmod_elf_get_memory(elf);
 
919
        } else {
 
920
                mem = kmod_file_get_contents(mod->file);
 
921
        }
 
922
        size = kmod_file_get_size(mod->file);
 
923
 
 
924
        err = init_module(mem, size, args);
 
925
        if (err < 0)
 
926
                err = -errno;
 
927
 
 
928
        return err;
 
929
}
 
930
 
864
931
/**
865
932
 * kmod_module_insert_module:
866
933
 * @mod: kmod module
881
948
                                                        const char *options)
882
949
{
883
950
        int err;
884
 
        const void *mem;
885
 
        off_t size;
886
 
        struct kmod_elf *elf;
887
951
        const char *path;
888
952
        const char *args = options ? options : "";
889
953
 
904
968
                }
905
969
        }
906
970
 
907
 
        if (kmod_file_get_direct(mod->file)) {
908
 
                unsigned int kernel_flags = 0;
909
 
 
910
 
                if (flags & KMOD_INSERT_FORCE_VERMAGIC)
911
 
                        kernel_flags |= MODULE_INIT_IGNORE_VERMAGIC;
912
 
                if (flags & KMOD_INSERT_FORCE_MODVERSION)
913
 
                        kernel_flags |= MODULE_INIT_IGNORE_MODVERSIONS;
914
 
 
915
 
                err = finit_module(kmod_file_get_fd(mod->file), args, kernel_flags);
916
 
                if (err == 0 || errno != ENOSYS)
917
 
                        goto init_finished;
918
 
        }
919
 
 
920
 
        kmod_file_load_contents(mod->file);
921
 
 
922
 
        if (flags & (KMOD_INSERT_FORCE_VERMAGIC | KMOD_INSERT_FORCE_MODVERSION)) {
923
 
                elf = kmod_file_get_elf(mod->file);
924
 
                if (elf == NULL) {
925
 
                        err = -errno;
926
 
                        return err;
927
 
                }
928
 
 
929
 
                if (flags & KMOD_INSERT_FORCE_MODVERSION) {
930
 
                        err = kmod_elf_strip_section(elf, "__versions");
931
 
                        if (err < 0)
932
 
                                INFO(mod->ctx, "Failed to strip modversion: %s\n", strerror(-err));
933
 
                }
934
 
 
935
 
                if (flags & KMOD_INSERT_FORCE_VERMAGIC) {
936
 
                        err = kmod_elf_strip_vermagic(elf);
937
 
                        if (err < 0)
938
 
                                INFO(mod->ctx, "Failed to strip vermagic: %s\n", strerror(-err));
939
 
                }
940
 
 
941
 
                mem = kmod_elf_get_memory(elf);
942
 
        } else {
943
 
                mem = kmod_file_get_contents(mod->file);
944
 
        }
945
 
        size = kmod_file_get_size(mod->file);
946
 
 
947
 
        err = init_module(mem, size, args);
948
 
init_finished:
949
 
        if (err < 0) {
950
 
                err = -errno;
951
 
                INFO(mod->ctx, "Failed to insert module '%s': %m\n", path);
952
 
        }
 
971
        err = do_finit_module(mod, flags, args);
 
972
        if (err == -ENOSYS)
 
973
                err = do_init_module(mod, flags, args);
 
974
 
 
975
        if (err < 0)
 
976
                INFO(mod->ctx, "Failed to insert module '%s': %s\n",
 
977
                     path, strerror(-err));
 
978
 
953
979
        return err;
954
980
}
955
981