diff options
Diffstat (limited to 'scripts/mod/modpost.c')
| -rw-r--r-- | scripts/mod/modpost.c | 56 | 
1 files changed, 35 insertions, 21 deletions
| diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 48397feb08fb..98314b400a95 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -47,6 +47,12 @@ enum export {  	export_unused_gpl, export_gpl_future, export_unknown  }; +/* In kernel, this size is defined in linux/module.h; + * here we use Elf_Addr instead of long for covering cross-compile + */ + +#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) +  #define PRINTF __attribute__ ((format (printf, 1, 2)))  PRINTF void fatal(const char *fmt, ...) @@ -261,7 +267,17 @@ static enum export export_no(const char *s)  	return export_unknown;  } -static const char *sec_name(struct elf_info *elf, int secindex); +static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr) +{ +	return (void *)elf->hdr + +		elf->sechdrs[elf->secindex_strings].sh_offset + +		sechdr->sh_name; +} + +static const char *sec_name(struct elf_info *elf, int secindex) +{ +	return sech_name(elf, &elf->sechdrs[secindex]); +}  #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0) @@ -775,21 +791,6 @@ static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)  		return "(unknown)";  } -static const char *sec_name(struct elf_info *elf, int secindex) -{ -	Elf_Shdr *sechdrs = elf->sechdrs; -	return (void *)elf->hdr + -		elf->sechdrs[elf->secindex_strings].sh_offset + -		sechdrs[secindex].sh_name; -} - -static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr) -{ -	return (void *)elf->hdr + -		elf->sechdrs[elf->secindex_strings].sh_offset + -		sechdr->sh_name; -} -  /* The pattern is an array of simple patterns.   * "foo" will match an exact string equal to "foo"   * "*foo" will match a string that ends with "foo" @@ -2116,6 +2117,23 @@ static void check_exports(struct module *mod)  	}  } +static int check_modname_len(struct module *mod) +{ +	const char *mod_name; + +	mod_name = strrchr(mod->name, '/'); +	if (mod_name == NULL) +		mod_name = mod->name; +	else +		mod_name++; +	if (strlen(mod_name) >= MODULE_NAME_LEN) { +		merror("module name is too long [%s.ko]\n", mod->name); +		return 1; +	} + +	return 0; +} +  /**   * Header for the generated file   **/ @@ -2155,11 +2173,6 @@ static void add_staging_flag(struct buffer *b, const char *name)  		buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");  } -/* In kernel, this size is defined in linux/module.h; - * here we use Elf_Addr instead of long for covering cross-compile - */ -#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) -  /**   * Record CRCs for unresolved symbols   **/ @@ -2490,6 +2503,7 @@ int main(int argc, char **argv)  		buf.pos = 0; +		err |= check_modname_len(mod);  		add_header(&buf, mod);  		add_intree_flag(&buf, !external_module);  		add_staging_flag(&buf, mod->name); |