diff options
author | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-07-01 10:10:19 +0200 |
---|---|---|
committer | Sam Ravnborg <sam@mars.ravnborg.org> | 2006-07-01 10:10:19 +0200 |
commit | 534b89a9f6a86a28300cd71619112c4bbca7c0ae (patch) | |
tree | bdde1be43f714e671f83f860f528f1065f597d98 /scripts/mod/modpost.c | |
parent | 66392c4f2246641c13b5dc60d15b09a71e09276f (diff) | |
download | lwn-534b89a9f6a86a28300cd71619112c4bbca7c0ae.tar.gz lwn-534b89a9f6a86a28300cd71619112c4bbca7c0ae.zip |
kbuild: fix segv in modpost
Parsing an old Modules.symvers file casued modpost to SEGV.
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Diffstat (limited to 'scripts/mod/modpost.c')
-rw-r--r-- | scripts/mod/modpost.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 0dd16177642d..65411665e13c 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -205,6 +205,8 @@ static const char *export_str(enum export ex) static enum export export_no(const char * s) { int i; + if (!s) + return export_unknown; for (i = 0; export_list[i].export != export_unknown; i++) { if (strcmp(export_list[i].str, s) == 0) return export_list[i].export; @@ -1271,7 +1273,7 @@ static void write_if_changed(struct buffer *b, const char *fname) } /* parse Module.symvers file. line format: - * 0x12345678<tab>symbol<tab>module[<tab>export] + * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something] **/ static void read_dump(const char *fname, unsigned int kernel) { @@ -1284,7 +1286,7 @@ static void read_dump(const char *fname, unsigned int kernel) return; while ((line = get_next_line(&pos, file, size))) { - char *symname, *modname, *d, *export; + char *symname, *modname, *d, *export, *end; unsigned int crc; struct module *mod; struct symbol *s; @@ -1297,7 +1299,8 @@ static void read_dump(const char *fname, unsigned int kernel) *modname++ = '\0'; if ((export = strchr(modname, '\t')) != NULL) *export++ = '\0'; - + if (export && ((end = strchr(export, '\t')) != NULL)) + *end = '\0'; crc = strtoul(line, &d, 16); if (*symname == '\0' || *modname == '\0' || *d != '\0') goto fail; |