| From 10b465aaf9536ee5a16652fa0700740183d48ec9 Mon Sep 17 00:00:00 2001 |
| From: Ben Hutchings <ben@decadent.org.uk> |
| Date: Sat, 19 Dec 2009 14:43:01 +0000 |
| Subject: modules: Skip empty sections when exporting section notes |
| |
| From: Ben Hutchings <ben@decadent.org.uk> |
| |
| commit 10b465aaf9536ee5a16652fa0700740183d48ec9 upstream. |
| |
| Commit 35dead4 "modules: don't export section names of empty sections |
| via sysfs" changed the set of sections that have attributes, but did |
| not change the iteration over these attributes in add_notes_attrs(). |
| This can lead to add_notes_attrs() creating attributes with the wrong |
| names or with null name pointers. |
| |
| Introduce a sect_empty() function and use it in both add_sect_attrs() |
| and add_notes_attrs(). |
| |
| Reported-by: Martin Michlmayr <tbm@cyrius.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| Tested-by: Martin Michlmayr <tbm@cyrius.com> |
| Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/module.c | 17 ++++++++++------- |
| 1 file changed, 10 insertions(+), 7 deletions(-) |
| |
| --- a/kernel/module.c |
| +++ b/kernel/module.c |
| @@ -1146,6 +1146,12 @@ static const struct kernel_symbol *resol |
| * J. Corbet <corbet@lwn.net> |
| */ |
| #if defined(CONFIG_KALLSYMS) && defined(CONFIG_SYSFS) |
| + |
| +static inline bool sect_empty(const Elf_Shdr *sect) |
| +{ |
| + return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0; |
| +} |
| + |
| struct module_sect_attr |
| { |
| struct module_attribute mattr; |
| @@ -1187,8 +1193,7 @@ static void add_sect_attrs(struct module |
| |
| /* Count loaded sections and allocate structures */ |
| for (i = 0; i < nsect; i++) |
| - if (sechdrs[i].sh_flags & SHF_ALLOC |
| - && sechdrs[i].sh_size) |
| + if (!sect_empty(&sechdrs[i])) |
| nloaded++; |
| size[0] = ALIGN(sizeof(*sect_attrs) |
| + nloaded * sizeof(sect_attrs->attrs[0]), |
| @@ -1206,9 +1211,7 @@ static void add_sect_attrs(struct module |
| sattr = §_attrs->attrs[0]; |
| gattr = §_attrs->grp.attrs[0]; |
| for (i = 0; i < nsect; i++) { |
| - if (! (sechdrs[i].sh_flags & SHF_ALLOC)) |
| - continue; |
| - if (!sechdrs[i].sh_size) |
| + if (sect_empty(&sechdrs[i])) |
| continue; |
| sattr->address = sechdrs[i].sh_addr; |
| sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, |
| @@ -1292,7 +1295,7 @@ static void add_notes_attrs(struct modul |
| /* Count notes sections and allocate structures. */ |
| notes = 0; |
| for (i = 0; i < nsect; i++) |
| - if ((sechdrs[i].sh_flags & SHF_ALLOC) && |
| + if (!sect_empty(&sechdrs[i]) && |
| (sechdrs[i].sh_type == SHT_NOTE)) |
| ++notes; |
| |
| @@ -1308,7 +1311,7 @@ static void add_notes_attrs(struct modul |
| notes_attrs->notes = notes; |
| nattr = ¬es_attrs->attrs[0]; |
| for (loaded = i = 0; i < nsect; ++i) { |
| - if (!(sechdrs[i].sh_flags & SHF_ALLOC)) |
| + if (sect_empty(&sechdrs[i])) |
| continue; |
| if (sechdrs[i].sh_type == SHT_NOTE) { |
| nattr->attr.name = mod->sect_attrs->attrs[loaded].name; |