Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5830f208 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Sasha Levin
Browse files

recordmcount: Correct st_shndx handling

[ Upstream commit fb780761e7bd9f2e94f5b9a296ead6b35b944206 ]

One should only use st_shndx when >SHN_UNDEF and <SHN_LORESERVE. When
SHN_XINDEX, then use .symtab_shndx. Otherwise use 0.

This handles the case: st_shndx >= SHN_LORESERVE && st_shndx != SHN_XINDEX.

Link: https://lore.kernel.org/lkml/20210607023839.26387-1-mark-pk.tsai@mediatek.com/
Link: https://lkml.kernel.org/r/20210616154126.2794-1-mark-pk.tsai@mediatek.com



Reported-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
Tested-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
[handle endianness of sym->st_shndx]
Signed-off-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 70866199
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -192,17 +192,22 @@ static unsigned int get_symindex(Elf_Sym const *sym, Elf32_Word const *symtab,
				 Elf32_Word const *symtab_shndx)
{
	unsigned long offset;
	unsigned short shndx = w2(sym->st_shndx);
	int index;

	if (sym->st_shndx != SHN_XINDEX)
		return w2(sym->st_shndx);
	if (shndx > SHN_UNDEF && shndx < SHN_LORESERVE)
		return shndx;

	if (shndx == SHN_XINDEX) {
		offset = (unsigned long)sym - (unsigned long)symtab;
		index = offset / sizeof(*sym);

		return w(symtab_shndx[index]);
	}

	return 0;
}

static unsigned int get_shnum(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0)
{
	if (shdr0 && !ehdr->e_shnum)