modules: Skip empty sections when exporting section notes
PATCH 1/1 modules: Skip empty sections when exporting section notes
Date: Sat, 19 Dec 2009 14:43:01 +0000
From: Ben Hutchings <[email protected]>
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 <[email protected]>
Signed-off-by Ben Hutchings <[email protected]>
Tested-by Martin Michlmayr <[email protected]>
Signed-off-by Rusty Russell <[email protected]>
--- kernel/module.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
kernel/module.c +10 -7
@@ -1010,6 +1010,12 @@ static const struct kernel_symbol *resolve_symbol(Elf_Shdr *sechdrs,* J. Corbet <[email protected]> */ #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;
@@ -1051,8 +1057,7 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect,/* 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]),
@@ -1070,9 +1075,7 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, 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,
@@ -1156,7 +1159,7 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect,/* 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;
@@ -1172,7 +1175,7 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect, 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;