aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-08-08 01:46:20 -0400
committerRusty Russell <rusty@rustcorp.com.au>2015-08-08 06:22:08 -0400
commit5cfb203a304deaaa8c7c5368722b214d24583137 (patch)
tree922f699aaabbb7dd1154af56005357b1d14a0f8e
parentdd2384a75d1c046faf068a6352732a204814b86d (diff)
modpost: abort if a module symbol is too long
Module symbols have a limited length, but currently the build system allows the build finishing even if the driver code contains a too long symbol name, which eventually overflows the modversion_info[] item. The compiler may catch at compiling *.mod.c like CC xxx.mod.o xxx.mod.c:18:16: warning: initializer-string for array of chars is too long but it's merely a warning. This patch adds the check of the symbol length in modpost and stops the build properly. Currently MODULE_NAME_LEN is defined in modpost.c instead of referring to the definition in kernel header because including linux/module.h is messy and we must cover cross-compilation. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--scripts/mod/modpost.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 12d3db3bd46b..d583c98fde31 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -2133,6 +2133,11 @@ static void add_staging_flag(struct buffer *b, const char *name)
2133 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); 2133 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2134} 2134}
2135 2135
2136/* In kernel, this size is defined in linux/module.h;
2137 * here we use Elf_Addr instead of long for covering cross-compile
2138 */
2139#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
2140
2136/** 2141/**
2137 * Record CRCs for unresolved symbols 2142 * Record CRCs for unresolved symbols
2138 **/ 2143 **/
@@ -2177,6 +2182,12 @@ static int add_versions(struct buffer *b, struct module *mod)
2177 s->name, mod->name); 2182 s->name, mod->name);
2178 continue; 2183 continue;
2179 } 2184 }
2185 if (strlen(s->name) >= MODULE_NAME_LEN) {
2186 merror("too long symbol \"%s\" [%s.ko]\n",
2187 s->name, mod->name);
2188 err = 1;
2189 break;
2190 }
2180 buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n", 2191 buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2181 s->crc, s->name); 2192 s->crc, s->name);
2182 } 2193 }