diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 205 |
1 files changed, 110 insertions, 95 deletions
diff --git a/kernel/module.c b/kernel/module.c index 178333c48d1e..acf6ed3ebe81 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -62,12 +62,6 @@ | |||
62 | #define CREATE_TRACE_POINTS | 62 | #define CREATE_TRACE_POINTS |
63 | #include <trace/events/module.h> | 63 | #include <trace/events/module.h> |
64 | 64 | ||
65 | #if 0 | ||
66 | #define DEBUGP printk | ||
67 | #else | ||
68 | #define DEBUGP(fmt , a...) | ||
69 | #endif | ||
70 | |||
71 | #ifndef ARCH_SHF_SMALL | 65 | #ifndef ARCH_SHF_SMALL |
72 | #define ARCH_SHF_SMALL 0 | 66 | #define ARCH_SHF_SMALL 0 |
73 | #endif | 67 | #endif |
@@ -138,7 +132,6 @@ struct load_info { | |||
138 | unsigned long len; | 132 | unsigned long len; |
139 | Elf_Shdr *sechdrs; | 133 | Elf_Shdr *sechdrs; |
140 | char *secstrings, *strtab; | 134 | char *secstrings, *strtab; |
141 | unsigned long *strmap; | ||
142 | unsigned long symoffs, stroffs; | 135 | unsigned long symoffs, stroffs; |
143 | struct _ddebug *debug; | 136 | struct _ddebug *debug; |
144 | unsigned int num_debug; | 137 | unsigned int num_debug; |
@@ -410,7 +403,7 @@ const struct kernel_symbol *find_symbol(const char *name, | |||
410 | return fsa.sym; | 403 | return fsa.sym; |
411 | } | 404 | } |
412 | 405 | ||
413 | DEBUGP("Failed to find symbol %s\n", name); | 406 | pr_debug("Failed to find symbol %s\n", name); |
414 | return NULL; | 407 | return NULL; |
415 | } | 408 | } |
416 | EXPORT_SYMBOL_GPL(find_symbol); | 409 | EXPORT_SYMBOL_GPL(find_symbol); |
@@ -600,11 +593,11 @@ static int already_uses(struct module *a, struct module *b) | |||
600 | 593 | ||
601 | list_for_each_entry(use, &b->source_list, source_list) { | 594 | list_for_each_entry(use, &b->source_list, source_list) { |
602 | if (use->source == a) { | 595 | if (use->source == a) { |
603 | DEBUGP("%s uses %s!\n", a->name, b->name); | 596 | pr_debug("%s uses %s!\n", a->name, b->name); |
604 | return 1; | 597 | return 1; |
605 | } | 598 | } |
606 | } | 599 | } |
607 | DEBUGP("%s does not use %s!\n", a->name, b->name); | 600 | pr_debug("%s does not use %s!\n", a->name, b->name); |
608 | return 0; | 601 | return 0; |
609 | } | 602 | } |
610 | 603 | ||
@@ -619,7 +612,7 @@ static int add_module_usage(struct module *a, struct module *b) | |||
619 | { | 612 | { |
620 | struct module_use *use; | 613 | struct module_use *use; |
621 | 614 | ||
622 | DEBUGP("Allocating new usage for %s.\n", a->name); | 615 | pr_debug("Allocating new usage for %s.\n", a->name); |
623 | use = kmalloc(sizeof(*use), GFP_ATOMIC); | 616 | use = kmalloc(sizeof(*use), GFP_ATOMIC); |
624 | if (!use) { | 617 | if (!use) { |
625 | printk(KERN_WARNING "%s: out of memory loading\n", a->name); | 618 | printk(KERN_WARNING "%s: out of memory loading\n", a->name); |
@@ -663,7 +656,7 @@ static void module_unload_free(struct module *mod) | |||
663 | mutex_lock(&module_mutex); | 656 | mutex_lock(&module_mutex); |
664 | list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) { | 657 | list_for_each_entry_safe(use, tmp, &mod->target_list, target_list) { |
665 | struct module *i = use->target; | 658 | struct module *i = use->target; |
666 | DEBUGP("%s unusing %s\n", mod->name, i->name); | 659 | pr_debug("%s unusing %s\n", mod->name, i->name); |
667 | module_put(i); | 660 | module_put(i); |
668 | list_del(&use->source_list); | 661 | list_del(&use->source_list); |
669 | list_del(&use->target_list); | 662 | list_del(&use->target_list); |
@@ -726,9 +719,9 @@ static int try_stop_module(struct module *mod, int flags, int *forced) | |||
726 | } | 719 | } |
727 | } | 720 | } |
728 | 721 | ||
729 | unsigned int module_refcount(struct module *mod) | 722 | unsigned long module_refcount(struct module *mod) |
730 | { | 723 | { |
731 | unsigned int incs = 0, decs = 0; | 724 | unsigned long incs = 0, decs = 0; |
732 | int cpu; | 725 | int cpu; |
733 | 726 | ||
734 | for_each_possible_cpu(cpu) | 727 | for_each_possible_cpu(cpu) |
@@ -761,7 +754,7 @@ static void wait_for_zero_refcount(struct module *mod) | |||
761 | /* Since we might sleep for some time, release the mutex first */ | 754 | /* Since we might sleep for some time, release the mutex first */ |
762 | mutex_unlock(&module_mutex); | 755 | mutex_unlock(&module_mutex); |
763 | for (;;) { | 756 | for (;;) { |
764 | DEBUGP("Looking at refcount...\n"); | 757 | pr_debug("Looking at refcount...\n"); |
765 | set_current_state(TASK_UNINTERRUPTIBLE); | 758 | set_current_state(TASK_UNINTERRUPTIBLE); |
766 | if (module_refcount(mod) == 0) | 759 | if (module_refcount(mod) == 0) |
767 | break; | 760 | break; |
@@ -804,7 +797,7 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | |||
804 | if (mod->state != MODULE_STATE_LIVE) { | 797 | if (mod->state != MODULE_STATE_LIVE) { |
805 | /* FIXME: if (force), slam module count and wake up | 798 | /* FIXME: if (force), slam module count and wake up |
806 | waiter --RR */ | 799 | waiter --RR */ |
807 | DEBUGP("%s already dying\n", mod->name); | 800 | pr_debug("%s already dying\n", mod->name); |
808 | ret = -EBUSY; | 801 | ret = -EBUSY; |
809 | goto out; | 802 | goto out; |
810 | } | 803 | } |
@@ -849,12 +842,32 @@ out: | |||
849 | return ret; | 842 | return ret; |
850 | } | 843 | } |
851 | 844 | ||
845 | static size_t module_flags_taint(struct module *mod, char *buf) | ||
846 | { | ||
847 | size_t l = 0; | ||
848 | |||
849 | if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE)) | ||
850 | buf[l++] = 'P'; | ||
851 | if (mod->taints & (1 << TAINT_OOT_MODULE)) | ||
852 | buf[l++] = 'O'; | ||
853 | if (mod->taints & (1 << TAINT_FORCED_MODULE)) | ||
854 | buf[l++] = 'F'; | ||
855 | if (mod->taints & (1 << TAINT_CRAP)) | ||
856 | buf[l++] = 'C'; | ||
857 | /* | ||
858 | * TAINT_FORCED_RMMOD: could be added. | ||
859 | * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't | ||
860 | * apply to modules. | ||
861 | */ | ||
862 | return l; | ||
863 | } | ||
864 | |||
852 | static inline void print_unload_info(struct seq_file *m, struct module *mod) | 865 | static inline void print_unload_info(struct seq_file *m, struct module *mod) |
853 | { | 866 | { |
854 | struct module_use *use; | 867 | struct module_use *use; |
855 | int printed_something = 0; | 868 | int printed_something = 0; |
856 | 869 | ||
857 | seq_printf(m, " %u ", module_refcount(mod)); | 870 | seq_printf(m, " %lu ", module_refcount(mod)); |
858 | 871 | ||
859 | /* Always include a trailing , so userspace can differentiate | 872 | /* Always include a trailing , so userspace can differentiate |
860 | between this and the old multi-field proc format. */ | 873 | between this and the old multi-field proc format. */ |
@@ -904,13 +917,11 @@ EXPORT_SYMBOL_GPL(symbol_put_addr); | |||
904 | static ssize_t show_refcnt(struct module_attribute *mattr, | 917 | static ssize_t show_refcnt(struct module_attribute *mattr, |
905 | struct module_kobject *mk, char *buffer) | 918 | struct module_kobject *mk, char *buffer) |
906 | { | 919 | { |
907 | return sprintf(buffer, "%u\n", module_refcount(mk->mod)); | 920 | return sprintf(buffer, "%lu\n", module_refcount(mk->mod)); |
908 | } | 921 | } |
909 | 922 | ||
910 | static struct module_attribute refcnt = { | 923 | static struct module_attribute modinfo_refcnt = |
911 | .attr = { .name = "refcnt", .mode = 0444 }, | 924 | __ATTR(refcnt, 0444, show_refcnt, NULL); |
912 | .show = show_refcnt, | ||
913 | }; | ||
914 | 925 | ||
915 | void module_put(struct module *module) | 926 | void module_put(struct module *module) |
916 | { | 927 | { |
@@ -970,10 +981,8 @@ static ssize_t show_initstate(struct module_attribute *mattr, | |||
970 | return sprintf(buffer, "%s\n", state); | 981 | return sprintf(buffer, "%s\n", state); |
971 | } | 982 | } |
972 | 983 | ||
973 | static struct module_attribute initstate = { | 984 | static struct module_attribute modinfo_initstate = |
974 | .attr = { .name = "initstate", .mode = 0444 }, | 985 | __ATTR(initstate, 0444, show_initstate, NULL); |
975 | .show = show_initstate, | ||
976 | }; | ||
977 | 986 | ||
978 | static ssize_t store_uevent(struct module_attribute *mattr, | 987 | static ssize_t store_uevent(struct module_attribute *mattr, |
979 | struct module_kobject *mk, | 988 | struct module_kobject *mk, |
@@ -986,18 +995,50 @@ static ssize_t store_uevent(struct module_attribute *mattr, | |||
986 | return count; | 995 | return count; |
987 | } | 996 | } |
988 | 997 | ||
989 | struct module_attribute module_uevent = { | 998 | struct module_attribute module_uevent = |
990 | .attr = { .name = "uevent", .mode = 0200 }, | 999 | __ATTR(uevent, 0200, NULL, store_uevent); |
991 | .store = store_uevent, | 1000 | |
992 | }; | 1001 | static ssize_t show_coresize(struct module_attribute *mattr, |
1002 | struct module_kobject *mk, char *buffer) | ||
1003 | { | ||
1004 | return sprintf(buffer, "%u\n", mk->mod->core_size); | ||
1005 | } | ||
1006 | |||
1007 | static struct module_attribute modinfo_coresize = | ||
1008 | __ATTR(coresize, 0444, show_coresize, NULL); | ||
1009 | |||
1010 | static ssize_t show_initsize(struct module_attribute *mattr, | ||
1011 | struct module_kobject *mk, char *buffer) | ||
1012 | { | ||
1013 | return sprintf(buffer, "%u\n", mk->mod->init_size); | ||
1014 | } | ||
1015 | |||
1016 | static struct module_attribute modinfo_initsize = | ||
1017 | __ATTR(initsize, 0444, show_initsize, NULL); | ||
1018 | |||
1019 | static ssize_t show_taint(struct module_attribute *mattr, | ||
1020 | struct module_kobject *mk, char *buffer) | ||
1021 | { | ||
1022 | size_t l; | ||
1023 | |||
1024 | l = module_flags_taint(mk->mod, buffer); | ||
1025 | buffer[l++] = '\n'; | ||
1026 | return l; | ||
1027 | } | ||
1028 | |||
1029 | static struct module_attribute modinfo_taint = | ||
1030 | __ATTR(taint, 0444, show_taint, NULL); | ||
993 | 1031 | ||
994 | static struct module_attribute *modinfo_attrs[] = { | 1032 | static struct module_attribute *modinfo_attrs[] = { |
1033 | &module_uevent, | ||
995 | &modinfo_version, | 1034 | &modinfo_version, |
996 | &modinfo_srcversion, | 1035 | &modinfo_srcversion, |
997 | &initstate, | 1036 | &modinfo_initstate, |
998 | &module_uevent, | 1037 | &modinfo_coresize, |
1038 | &modinfo_initsize, | ||
1039 | &modinfo_taint, | ||
999 | #ifdef CONFIG_MODULE_UNLOAD | 1040 | #ifdef CONFIG_MODULE_UNLOAD |
1000 | &refcnt, | 1041 | &modinfo_refcnt, |
1001 | #endif | 1042 | #endif |
1002 | NULL, | 1043 | NULL, |
1003 | }; | 1044 | }; |
@@ -1057,7 +1098,7 @@ static int check_version(Elf_Shdr *sechdrs, | |||
1057 | 1098 | ||
1058 | if (versions[i].crc == maybe_relocated(*crc, crc_owner)) | 1099 | if (versions[i].crc == maybe_relocated(*crc, crc_owner)) |
1059 | return 1; | 1100 | return 1; |
1060 | DEBUGP("Found checksum %lX vs module %lX\n", | 1101 | pr_debug("Found checksum %lX vs module %lX\n", |
1061 | maybe_relocated(*crc, crc_owner), versions[i].crc); | 1102 | maybe_relocated(*crc, crc_owner), versions[i].crc); |
1062 | goto bad_version; | 1103 | goto bad_version; |
1063 | } | 1104 | } |
@@ -1834,7 +1875,7 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) | |||
1834 | case SHN_COMMON: | 1875 | case SHN_COMMON: |
1835 | /* We compiled with -fno-common. These are not | 1876 | /* We compiled with -fno-common. These are not |
1836 | supposed to happen. */ | 1877 | supposed to happen. */ |
1837 | DEBUGP("Common symbol: %s\n", name); | 1878 | pr_debug("Common symbol: %s\n", name); |
1838 | printk("%s: please compile with -fno-common\n", | 1879 | printk("%s: please compile with -fno-common\n", |
1839 | mod->name); | 1880 | mod->name); |
1840 | ret = -ENOEXEC; | 1881 | ret = -ENOEXEC; |
@@ -1842,7 +1883,7 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) | |||
1842 | 1883 | ||
1843 | case SHN_ABS: | 1884 | case SHN_ABS: |
1844 | /* Don't need to do anything */ | 1885 | /* Don't need to do anything */ |
1845 | DEBUGP("Absolute symbol: 0x%08lx\n", | 1886 | pr_debug("Absolute symbol: 0x%08lx\n", |
1846 | (long)sym[i].st_value); | 1887 | (long)sym[i].st_value); |
1847 | break; | 1888 | break; |
1848 | 1889 | ||
@@ -1966,7 +2007,7 @@ static void layout_sections(struct module *mod, struct load_info *info) | |||
1966 | for (i = 0; i < info->hdr->e_shnum; i++) | 2007 | for (i = 0; i < info->hdr->e_shnum; i++) |
1967 | info->sechdrs[i].sh_entsize = ~0UL; | 2008 | info->sechdrs[i].sh_entsize = ~0UL; |
1968 | 2009 | ||
1969 | DEBUGP("Core section allocation order:\n"); | 2010 | pr_debug("Core section allocation order:\n"); |
1970 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { | 2011 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { |
1971 | for (i = 0; i < info->hdr->e_shnum; ++i) { | 2012 | for (i = 0; i < info->hdr->e_shnum; ++i) { |
1972 | Elf_Shdr *s = &info->sechdrs[i]; | 2013 | Elf_Shdr *s = &info->sechdrs[i]; |
@@ -1978,7 +2019,7 @@ static void layout_sections(struct module *mod, struct load_info *info) | |||
1978 | || strstarts(sname, ".init")) | 2019 | || strstarts(sname, ".init")) |
1979 | continue; | 2020 | continue; |
1980 | s->sh_entsize = get_offset(mod, &mod->core_size, s, i); | 2021 | s->sh_entsize = get_offset(mod, &mod->core_size, s, i); |
1981 | DEBUGP("\t%s\n", name); | 2022 | pr_debug("\t%s\n", sname); |
1982 | } | 2023 | } |
1983 | switch (m) { | 2024 | switch (m) { |
1984 | case 0: /* executable */ | 2025 | case 0: /* executable */ |
@@ -1995,7 +2036,7 @@ static void layout_sections(struct module *mod, struct load_info *info) | |||
1995 | } | 2036 | } |
1996 | } | 2037 | } |
1997 | 2038 | ||
1998 | DEBUGP("Init section allocation order:\n"); | 2039 | pr_debug("Init section allocation order:\n"); |
1999 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { | 2040 | for (m = 0; m < ARRAY_SIZE(masks); ++m) { |
2000 | for (i = 0; i < info->hdr->e_shnum; ++i) { | 2041 | for (i = 0; i < info->hdr->e_shnum; ++i) { |
2001 | Elf_Shdr *s = &info->sechdrs[i]; | 2042 | Elf_Shdr *s = &info->sechdrs[i]; |
@@ -2008,7 +2049,7 @@ static void layout_sections(struct module *mod, struct load_info *info) | |||
2008 | continue; | 2049 | continue; |
2009 | s->sh_entsize = (get_offset(mod, &mod->init_size, s, i) | 2050 | s->sh_entsize = (get_offset(mod, &mod->init_size, s, i) |
2010 | | INIT_OFFSET_MASK); | 2051 | | INIT_OFFSET_MASK); |
2011 | DEBUGP("\t%s\n", sname); | 2052 | pr_debug("\t%s\n", sname); |
2012 | } | 2053 | } |
2013 | switch (m) { | 2054 | switch (m) { |
2014 | case 0: /* executable */ | 2055 | case 0: /* executable */ |
@@ -2178,45 +2219,46 @@ static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs, | |||
2178 | return true; | 2219 | return true; |
2179 | } | 2220 | } |
2180 | 2221 | ||
2222 | /* | ||
2223 | * We only allocate and copy the strings needed by the parts of symtab | ||
2224 | * we keep. This is simple, but has the effect of making multiple | ||
2225 | * copies of duplicates. We could be more sophisticated, see | ||
2226 | * linux-kernel thread starting with | ||
2227 | * <73defb5e4bca04a6431392cc341112b1@localhost>. | ||
2228 | */ | ||
2181 | static void layout_symtab(struct module *mod, struct load_info *info) | 2229 | static void layout_symtab(struct module *mod, struct load_info *info) |
2182 | { | 2230 | { |
2183 | Elf_Shdr *symsect = info->sechdrs + info->index.sym; | 2231 | Elf_Shdr *symsect = info->sechdrs + info->index.sym; |
2184 | Elf_Shdr *strsect = info->sechdrs + info->index.str; | 2232 | Elf_Shdr *strsect = info->sechdrs + info->index.str; |
2185 | const Elf_Sym *src; | 2233 | const Elf_Sym *src; |
2186 | unsigned int i, nsrc, ndst; | 2234 | unsigned int i, nsrc, ndst, strtab_size; |
2187 | 2235 | ||
2188 | /* Put symbol section at end of init part of module. */ | 2236 | /* Put symbol section at end of init part of module. */ |
2189 | symsect->sh_flags |= SHF_ALLOC; | 2237 | symsect->sh_flags |= SHF_ALLOC; |
2190 | symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect, | 2238 | symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect, |
2191 | info->index.sym) | INIT_OFFSET_MASK; | 2239 | info->index.sym) | INIT_OFFSET_MASK; |
2192 | DEBUGP("\t%s\n", info->secstrings + symsect->sh_name); | 2240 | pr_debug("\t%s\n", info->secstrings + symsect->sh_name); |
2193 | 2241 | ||
2194 | src = (void *)info->hdr + symsect->sh_offset; | 2242 | src = (void *)info->hdr + symsect->sh_offset; |
2195 | nsrc = symsect->sh_size / sizeof(*src); | 2243 | nsrc = symsect->sh_size / sizeof(*src); |
2196 | for (ndst = i = 1; i < nsrc; ++i, ++src) | ||
2197 | if (is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) { | ||
2198 | unsigned int j = src->st_name; | ||
2199 | 2244 | ||
2200 | while (!__test_and_set_bit(j, info->strmap) | 2245 | /* Compute total space required for the core symbols' strtab. */ |
2201 | && info->strtab[j]) | 2246 | for (ndst = i = strtab_size = 1; i < nsrc; ++i, ++src) |
2202 | ++j; | 2247 | if (is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) { |
2203 | ++ndst; | 2248 | strtab_size += strlen(&info->strtab[src->st_name]) + 1; |
2249 | ndst++; | ||
2204 | } | 2250 | } |
2205 | 2251 | ||
2206 | /* Append room for core symbols at end of core part. */ | 2252 | /* Append room for core symbols at end of core part. */ |
2207 | info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1); | 2253 | info->symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1); |
2208 | mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym); | 2254 | info->stroffs = mod->core_size = info->symoffs + ndst * sizeof(Elf_Sym); |
2255 | mod->core_size += strtab_size; | ||
2209 | 2256 | ||
2210 | /* Put string table section at end of init part of module. */ | 2257 | /* Put string table section at end of init part of module. */ |
2211 | strsect->sh_flags |= SHF_ALLOC; | 2258 | strsect->sh_flags |= SHF_ALLOC; |
2212 | strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect, | 2259 | strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect, |
2213 | info->index.str) | INIT_OFFSET_MASK; | 2260 | info->index.str) | INIT_OFFSET_MASK; |
2214 | DEBUGP("\t%s\n", info->secstrings + strsect->sh_name); | 2261 | pr_debug("\t%s\n", info->secstrings + strsect->sh_name); |
2215 | |||
2216 | /* Append room for core symbols' strings at end of core part. */ | ||
2217 | info->stroffs = mod->core_size; | ||
2218 | __set_bit(0, info->strmap); | ||
2219 | mod->core_size += bitmap_weight(info->strmap, strsect->sh_size); | ||
2220 | } | 2262 | } |
2221 | 2263 | ||
2222 | static void add_kallsyms(struct module *mod, const struct load_info *info) | 2264 | static void add_kallsyms(struct module *mod, const struct load_info *info) |
@@ -2237,22 +2279,19 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) | |||
2237 | mod->symtab[i].st_info = elf_type(&mod->symtab[i], info); | 2279 | mod->symtab[i].st_info = elf_type(&mod->symtab[i], info); |
2238 | 2280 | ||
2239 | mod->core_symtab = dst = mod->module_core + info->symoffs; | 2281 | mod->core_symtab = dst = mod->module_core + info->symoffs; |
2282 | mod->core_strtab = s = mod->module_core + info->stroffs; | ||
2240 | src = mod->symtab; | 2283 | src = mod->symtab; |
2241 | *dst = *src; | 2284 | *dst = *src; |
2285 | *s++ = 0; | ||
2242 | for (ndst = i = 1; i < mod->num_symtab; ++i, ++src) { | 2286 | for (ndst = i = 1; i < mod->num_symtab; ++i, ++src) { |
2243 | if (!is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) | 2287 | if (!is_core_symbol(src, info->sechdrs, info->hdr->e_shnum)) |
2244 | continue; | 2288 | continue; |
2289 | |||
2245 | dst[ndst] = *src; | 2290 | dst[ndst] = *src; |
2246 | dst[ndst].st_name = bitmap_weight(info->strmap, | 2291 | dst[ndst++].st_name = s - mod->core_strtab; |
2247 | dst[ndst].st_name); | 2292 | s += strlcpy(s, &mod->strtab[src->st_name], KSYM_NAME_LEN) + 1; |
2248 | ++ndst; | ||
2249 | } | 2293 | } |
2250 | mod->core_num_syms = ndst; | 2294 | mod->core_num_syms = ndst; |
2251 | |||
2252 | mod->core_strtab = s = mod->module_core + info->stroffs; | ||
2253 | for (*s = 0, i = 1; i < info->sechdrs[info->index.str].sh_size; ++i) | ||
2254 | if (test_bit(i, info->strmap)) | ||
2255 | *++s = mod->strtab[i]; | ||
2256 | } | 2295 | } |
2257 | #else | 2296 | #else |
2258 | static inline void layout_symtab(struct module *mod, struct load_info *info) | 2297 | static inline void layout_symtab(struct module *mod, struct load_info *info) |
@@ -2621,7 +2660,7 @@ static int move_module(struct module *mod, struct load_info *info) | |||
2621 | mod->module_init = ptr; | 2660 | mod->module_init = ptr; |
2622 | 2661 | ||
2623 | /* Transfer each section which specifies SHF_ALLOC */ | 2662 | /* Transfer each section which specifies SHF_ALLOC */ |
2624 | DEBUGP("final section addresses:\n"); | 2663 | pr_debug("final section addresses:\n"); |
2625 | for (i = 0; i < info->hdr->e_shnum; i++) { | 2664 | for (i = 0; i < info->hdr->e_shnum; i++) { |
2626 | void *dest; | 2665 | void *dest; |
2627 | Elf_Shdr *shdr = &info->sechdrs[i]; | 2666 | Elf_Shdr *shdr = &info->sechdrs[i]; |
@@ -2639,8 +2678,8 @@ static int move_module(struct module *mod, struct load_info *info) | |||
2639 | memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); | 2678 | memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); |
2640 | /* Update sh_addr to point to copy in image. */ | 2679 | /* Update sh_addr to point to copy in image. */ |
2641 | shdr->sh_addr = (unsigned long)dest; | 2680 | shdr->sh_addr = (unsigned long)dest; |
2642 | DEBUGP("\t0x%lx %s\n", | 2681 | pr_debug("\t0x%lx %s\n", |
2643 | shdr->sh_addr, info->secstrings + shdr->sh_name); | 2682 | (long)shdr->sh_addr, info->secstrings + shdr->sh_name); |
2644 | } | 2683 | } |
2645 | 2684 | ||
2646 | return 0; | 2685 | return 0; |
@@ -2742,27 +2781,18 @@ static struct module *layout_and_allocate(struct load_info *info) | |||
2742 | this is done generically; there doesn't appear to be any | 2781 | this is done generically; there doesn't appear to be any |
2743 | special cases for the architectures. */ | 2782 | special cases for the architectures. */ |
2744 | layout_sections(mod, info); | 2783 | layout_sections(mod, info); |
2745 | |||
2746 | info->strmap = kzalloc(BITS_TO_LONGS(info->sechdrs[info->index.str].sh_size) | ||
2747 | * sizeof(long), GFP_KERNEL); | ||
2748 | if (!info->strmap) { | ||
2749 | err = -ENOMEM; | ||
2750 | goto free_percpu; | ||
2751 | } | ||
2752 | layout_symtab(mod, info); | 2784 | layout_symtab(mod, info); |
2753 | 2785 | ||
2754 | /* Allocate and move to the final place */ | 2786 | /* Allocate and move to the final place */ |
2755 | err = move_module(mod, info); | 2787 | err = move_module(mod, info); |
2756 | if (err) | 2788 | if (err) |
2757 | goto free_strmap; | 2789 | goto free_percpu; |
2758 | 2790 | ||
2759 | /* Module has been copied to its final place now: return it. */ | 2791 | /* Module has been copied to its final place now: return it. */ |
2760 | mod = (void *)info->sechdrs[info->index.mod].sh_addr; | 2792 | mod = (void *)info->sechdrs[info->index.mod].sh_addr; |
2761 | kmemleak_load_module(mod, info); | 2793 | kmemleak_load_module(mod, info); |
2762 | return mod; | 2794 | return mod; |
2763 | 2795 | ||
2764 | free_strmap: | ||
2765 | kfree(info->strmap); | ||
2766 | free_percpu: | 2796 | free_percpu: |
2767 | percpu_modfree(mod); | 2797 | percpu_modfree(mod); |
2768 | out: | 2798 | out: |
@@ -2772,7 +2802,6 @@ out: | |||
2772 | /* mod is no longer valid after this! */ | 2802 | /* mod is no longer valid after this! */ |
2773 | static void module_deallocate(struct module *mod, struct load_info *info) | 2803 | static void module_deallocate(struct module *mod, struct load_info *info) |
2774 | { | 2804 | { |
2775 | kfree(info->strmap); | ||
2776 | percpu_modfree(mod); | 2805 | percpu_modfree(mod); |
2777 | module_free(mod, mod->module_init); | 2806 | module_free(mod, mod->module_init); |
2778 | module_free(mod, mod->module_core); | 2807 | module_free(mod, mod->module_core); |
@@ -2811,7 +2840,7 @@ static struct module *load_module(void __user *umod, | |||
2811 | struct module *mod; | 2840 | struct module *mod; |
2812 | long err; | 2841 | long err; |
2813 | 2842 | ||
2814 | DEBUGP("load_module: umod=%p, len=%lu, uargs=%p\n", | 2843 | pr_debug("load_module: umod=%p, len=%lu, uargs=%p\n", |
2815 | umod, len, uargs); | 2844 | umod, len, uargs); |
2816 | 2845 | ||
2817 | /* Copy in the blobs from userspace, check they are vaguely sane. */ | 2846 | /* Copy in the blobs from userspace, check they are vaguely sane. */ |
@@ -2902,8 +2931,7 @@ static struct module *load_module(void __user *umod, | |||
2902 | if (err < 0) | 2931 | if (err < 0) |
2903 | goto unlink; | 2932 | goto unlink; |
2904 | 2933 | ||
2905 | /* Get rid of temporary copy and strmap. */ | 2934 | /* Get rid of temporary copy. */ |
2906 | kfree(info.strmap); | ||
2907 | free_copy(&info); | 2935 | free_copy(&info); |
2908 | 2936 | ||
2909 | /* Done! */ | 2937 | /* Done! */ |
@@ -3256,20 +3284,7 @@ static char *module_flags(struct module *mod, char *buf) | |||
3256 | mod->state == MODULE_STATE_GOING || | 3284 | mod->state == MODULE_STATE_GOING || |
3257 | mod->state == MODULE_STATE_COMING) { | 3285 | mod->state == MODULE_STATE_COMING) { |
3258 | buf[bx++] = '('; | 3286 | buf[bx++] = '('; |
3259 | if (mod->taints & (1 << TAINT_PROPRIETARY_MODULE)) | 3287 | bx += module_flags_taint(mod, buf + bx); |
3260 | buf[bx++] = 'P'; | ||
3261 | else if (mod->taints & (1 << TAINT_OOT_MODULE)) | ||
3262 | buf[bx++] = 'O'; | ||
3263 | if (mod->taints & (1 << TAINT_FORCED_MODULE)) | ||
3264 | buf[bx++] = 'F'; | ||
3265 | if (mod->taints & (1 << TAINT_CRAP)) | ||
3266 | buf[bx++] = 'C'; | ||
3267 | /* | ||
3268 | * TAINT_FORCED_RMMOD: could be added. | ||
3269 | * TAINT_UNSAFE_SMP, TAINT_MACHINE_CHECK, TAINT_BAD_PAGE don't | ||
3270 | * apply to modules. | ||
3271 | */ | ||
3272 | |||
3273 | /* Show a - for module-is-being-unloaded */ | 3288 | /* Show a - for module-is-being-unloaded */ |
3274 | if (mod->state == MODULE_STATE_GOING) | 3289 | if (mod->state == MODULE_STATE_GOING) |
3275 | buf[bx++] = '-'; | 3290 | buf[bx++] = '-'; |