modules: Skip empty sections when exporting section notes
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>
Cc: stable@kernel.org
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
74d2e4f8d7
Коммит
10b465aaf9
|
@ -1010,6 +1010,12 @@ static const struct kernel_symbol *resolve_symbol(Elf_Shdr *sechdrs,
|
||||||
* J. Corbet <corbet@lwn.net>
|
* J. Corbet <corbet@lwn.net>
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_KALLSYMS) && defined(CONFIG_SYSFS)
|
#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_sect_attr
|
||||||
{
|
{
|
||||||
struct module_attribute mattr;
|
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 */
|
/* Count loaded sections and allocate structures */
|
||||||
for (i = 0; i < nsect; i++)
|
for (i = 0; i < nsect; i++)
|
||||||
if (sechdrs[i].sh_flags & SHF_ALLOC
|
if (!sect_empty(&sechdrs[i]))
|
||||||
&& sechdrs[i].sh_size)
|
|
||||||
nloaded++;
|
nloaded++;
|
||||||
size[0] = ALIGN(sizeof(*sect_attrs)
|
size[0] = ALIGN(sizeof(*sect_attrs)
|
||||||
+ nloaded * sizeof(sect_attrs->attrs[0]),
|
+ 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];
|
sattr = §_attrs->attrs[0];
|
||||||
gattr = §_attrs->grp.attrs[0];
|
gattr = §_attrs->grp.attrs[0];
|
||||||
for (i = 0; i < nsect; i++) {
|
for (i = 0; i < nsect; i++) {
|
||||||
if (! (sechdrs[i].sh_flags & SHF_ALLOC))
|
if (sect_empty(&sechdrs[i]))
|
||||||
continue;
|
|
||||||
if (!sechdrs[i].sh_size)
|
|
||||||
continue;
|
continue;
|
||||||
sattr->address = sechdrs[i].sh_addr;
|
sattr->address = sechdrs[i].sh_addr;
|
||||||
sattr->name = kstrdup(secstrings + sechdrs[i].sh_name,
|
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. */
|
/* Count notes sections and allocate structures. */
|
||||||
notes = 0;
|
notes = 0;
|
||||||
for (i = 0; i < nsect; i++)
|
for (i = 0; i < nsect; i++)
|
||||||
if ((sechdrs[i].sh_flags & SHF_ALLOC) &&
|
if (!sect_empty(&sechdrs[i]) &&
|
||||||
(sechdrs[i].sh_type == SHT_NOTE))
|
(sechdrs[i].sh_type == SHT_NOTE))
|
||||||
++notes;
|
++notes;
|
||||||
|
|
||||||
|
@ -1172,7 +1175,7 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect,
|
||||||
notes_attrs->notes = notes;
|
notes_attrs->notes = notes;
|
||||||
nattr = ¬es_attrs->attrs[0];
|
nattr = ¬es_attrs->attrs[0];
|
||||||
for (loaded = i = 0; i < nsect; ++i) {
|
for (loaded = i = 0; i < nsect; ++i) {
|
||||||
if (!(sechdrs[i].sh_flags & SHF_ALLOC))
|
if (sect_empty(&sechdrs[i]))
|
||||||
continue;
|
continue;
|
||||||
if (sechdrs[i].sh_type == SHT_NOTE) {
|
if (sechdrs[i].sh_type == SHT_NOTE) {
|
||||||
nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
|
nattr->attr.name = mod->sect_attrs->attrs[loaded].name;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче