Merge tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
Pull mudule updates from Rusty Russell: "We get rid of the general module prefix confusion with a binary config option, fix a remove/insert race which Never Happens, and (my favorite) handle the case when we have too many modules for a single commandline. Seriously, the kernel is full, please go away!" * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux: modpost: fix unwanted VMLINUX_SYMBOL_STR expansion X.509: Support parse long form of length octets in Authority Key Identifier module: don't unlink the module until we've removed all exposure. kernel: kallsyms: memory override issue, need check destination buffer length MODSIGN: do not send garbage to stderr when enabling modules signature modpost: handle huge numbers of modules. modpost: add -T option to read module names from file/stdin. modpost: minor cleanup. genksyms: pass symbol-prefix instead of arch module: fix symbol versioning with symbol prefixes CONFIG_SYMBOL_PREFIX: cleanup.
This commit is contained in:
+1
-1
@@ -176,7 +176,7 @@ signing_key.priv signing_key.x509: x509.genkey
|
||||
openssl req -new -nodes -utf8 -$(CONFIG_MODULE_SIG_HASH) -days 36500 \
|
||||
-batch -x509 -config x509.genkey \
|
||||
-outform DER -out signing_key.x509 \
|
||||
-keyout signing_key.priv
|
||||
-keyout signing_key.priv 2>&1
|
||||
@echo "###"
|
||||
@echo "### Key pair generated."
|
||||
@echo "###"
|
||||
|
||||
+18
-8
@@ -84,9 +84,11 @@ static int is_ksym_addr(unsigned long addr)
|
||||
|
||||
/*
|
||||
* Expand a compressed symbol data into the resulting uncompressed string,
|
||||
* if uncompressed string is too long (>= maxlen), it will be truncated,
|
||||
* given the offset to where the symbol is in the compressed stream.
|
||||
*/
|
||||
static unsigned int kallsyms_expand_symbol(unsigned int off, char *result)
|
||||
static unsigned int kallsyms_expand_symbol(unsigned int off,
|
||||
char *result, size_t maxlen)
|
||||
{
|
||||
int len, skipped_first = 0;
|
||||
const u8 *tptr, *data;
|
||||
@@ -113,15 +115,20 @@ static unsigned int kallsyms_expand_symbol(unsigned int off, char *result)
|
||||
|
||||
while (*tptr) {
|
||||
if (skipped_first) {
|
||||
if (maxlen <= 1)
|
||||
goto tail;
|
||||
*result = *tptr;
|
||||
result++;
|
||||
maxlen--;
|
||||
} else
|
||||
skipped_first = 1;
|
||||
tptr++;
|
||||
}
|
||||
}
|
||||
|
||||
*result = '\0';
|
||||
tail:
|
||||
if (maxlen)
|
||||
*result = '\0';
|
||||
|
||||
/* Return to offset to the next symbol. */
|
||||
return off;
|
||||
@@ -176,7 +183,7 @@ unsigned long kallsyms_lookup_name(const char *name)
|
||||
unsigned int off;
|
||||
|
||||
for (i = 0, off = 0; i < kallsyms_num_syms; i++) {
|
||||
off = kallsyms_expand_symbol(off, namebuf);
|
||||
off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));
|
||||
|
||||
if (strcmp(namebuf, name) == 0)
|
||||
return kallsyms_addresses[i];
|
||||
@@ -195,7 +202,7 @@ int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
|
||||
int ret;
|
||||
|
||||
for (i = 0, off = 0; i < kallsyms_num_syms; i++) {
|
||||
off = kallsyms_expand_symbol(off, namebuf);
|
||||
off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));
|
||||
ret = fn(data, namebuf, NULL, kallsyms_addresses[i]);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
@@ -294,7 +301,8 @@ const char *kallsyms_lookup(unsigned long addr,
|
||||
|
||||
pos = get_symbol_pos(addr, symbolsize, offset);
|
||||
/* Grab name */
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos), namebuf);
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos),
|
||||
namebuf, KSYM_NAME_LEN);
|
||||
if (modname)
|
||||
*modname = NULL;
|
||||
return namebuf;
|
||||
@@ -315,7 +323,8 @@ int lookup_symbol_name(unsigned long addr, char *symname)
|
||||
|
||||
pos = get_symbol_pos(addr, NULL, NULL);
|
||||
/* Grab name */
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos), symname);
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos),
|
||||
symname, KSYM_NAME_LEN);
|
||||
return 0;
|
||||
}
|
||||
/* See if it's in a module. */
|
||||
@@ -333,7 +342,8 @@ int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
|
||||
|
||||
pos = get_symbol_pos(addr, size, offset);
|
||||
/* Grab name */
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos), name);
|
||||
kallsyms_expand_symbol(get_symbol_offset(pos),
|
||||
name, KSYM_NAME_LEN);
|
||||
modname[0] = '\0';
|
||||
return 0;
|
||||
}
|
||||
@@ -463,7 +473,7 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter)
|
||||
|
||||
iter->type = kallsyms_get_symbol_type(off);
|
||||
|
||||
off = kallsyms_expand_symbol(off, iter->name);
|
||||
off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name));
|
||||
|
||||
return off - iter->nameoff;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,8 @@
|
||||
/* SYMBOL_PREFIX defined on commandline from CONFIG_SYMBOL_PREFIX */
|
||||
#ifndef SYMBOL_PREFIX
|
||||
#define ASM_SYMBOL(sym) sym
|
||||
#else
|
||||
#define PASTE2(x,y) x##y
|
||||
#define PASTE(x,y) PASTE2(x,y)
|
||||
#define ASM_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym)
|
||||
#endif
|
||||
#include <linux/export.h>
|
||||
|
||||
#define GLOBAL(name) \
|
||||
.globl ASM_SYMBOL(name); \
|
||||
ASM_SYMBOL(name):
|
||||
.globl VMLINUX_SYMBOL(name); \
|
||||
VMLINUX_SYMBOL(name):
|
||||
|
||||
.section ".init.data","aw"
|
||||
|
||||
|
||||
+12
-6
@@ -1209,10 +1209,11 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
|
||||
|
||||
/* Since this should be found in kernel (which can't be removed),
|
||||
* no locking is necessary. */
|
||||
if (!find_symbol(MODULE_SYMBOL_PREFIX "module_layout", NULL,
|
||||
if (!find_symbol(VMLINUX_SYMBOL_STR(module_layout), NULL,
|
||||
&crc, true, false))
|
||||
BUG();
|
||||
return check_version(sechdrs, versindex, "module_layout", mod, crc,
|
||||
return check_version(sechdrs, versindex,
|
||||
VMLINUX_SYMBOL_STR(module_layout), mod, crc,
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -1861,12 +1862,12 @@ static void free_module(struct module *mod)
|
||||
{
|
||||
trace_module_free(mod);
|
||||
|
||||
/* Delete from various lists */
|
||||
mutex_lock(&module_mutex);
|
||||
stop_machine(__unlink_module, mod, NULL);
|
||||
mutex_unlock(&module_mutex);
|
||||
mod_sysfs_teardown(mod);
|
||||
|
||||
/* We leave it in list to prevent duplicate loads, but make sure
|
||||
* that noone uses it while it's being deconstructed. */
|
||||
mod->state = MODULE_STATE_UNFORMED;
|
||||
|
||||
/* Remove dynamic debug info */
|
||||
ddebug_remove_module(mod->name);
|
||||
|
||||
@@ -1879,6 +1880,11 @@ static void free_module(struct module *mod)
|
||||
/* Free any allocated parameters. */
|
||||
destroy_params(mod->kp, mod->num_kp);
|
||||
|
||||
/* Now we can delete it from the lists */
|
||||
mutex_lock(&module_mutex);
|
||||
stop_machine(__unlink_module, mod, NULL);
|
||||
mutex_unlock(&module_mutex);
|
||||
|
||||
/* This may be NULL, but that's OK */
|
||||
unset_module_init_ro_nx(mod);
|
||||
module_free(mod, mod->module_init);
|
||||
|
||||
Reference in New Issue
Block a user