8144491: ElfSymbolTable::lookup returns bad value when the lookup has failed
Reviewed-by: dcubed, stefank
--- a/hotspot/src/share/vm/utilities/elfSymbolTable.cpp Fri Dec 04 13:39:59 2015 +0300
+++ b/hotspot/src/share/vm/utilities/elfSymbolTable.cpp Wed Dec 02 06:00:18 2015 -0800
@@ -69,6 +69,26 @@
}
}
+bool ElfSymbolTable::compare(const Elf_Sym* sym, address addr, int* stringtableIndex, int* posIndex, int* offset, ElfFuncDescTable* funcDescTable) {
+ if (STT_FUNC == ELF_ST_TYPE(sym->st_info)) {
+ Elf_Word st_size = sym->st_size;
+ address sym_addr;
+ if (funcDescTable != NULL && funcDescTable->get_index() == sym->st_shndx) {
+ // We need to go another step trough the function descriptor table (currently PPC64 only)
+ sym_addr = funcDescTable->lookup(sym->st_value);
+ } else {
+ sym_addr = (address)sym->st_value;
+ }
+ if (sym_addr <= addr && (Elf_Word)(addr - sym_addr) < st_size) {
+ *offset = (int)(addr - sym_addr);
+ *posIndex = sym->st_name;
+ *stringtableIndex = m_shdr.sh_link;
+ return true;
+ }
+ }
+ return false;
+}
+
bool ElfSymbolTable::lookup(address addr, int* stringtableIndex, int* posIndex, int* offset, ElfFuncDescTable* funcDescTable) {
assert(stringtableIndex, "null string table index pointer");
assert(posIndex, "null string table offset pointer");
@@ -83,21 +103,8 @@
int count = m_shdr.sh_size / sym_size;
if (m_symbols != NULL) {
for (int index = 0; index < count; index ++) {
- if (STT_FUNC == ELF_ST_TYPE(m_symbols[index].st_info)) {
- Elf_Word st_size = m_symbols[index].st_size;
- address sym_addr;
- if (funcDescTable != NULL && funcDescTable->get_index() == m_symbols[index].st_shndx) {
- // We need to go another step trough the function descriptor table (currently PPC64 only)
- sym_addr = funcDescTable->lookup(m_symbols[index].st_value);
- } else {
- sym_addr = (address)m_symbols[index].st_value;
- }
- if (sym_addr <= addr && (Elf_Word)(addr - sym_addr) < st_size) {
- *offset = (int)(addr - sym_addr);
- *posIndex = m_symbols[index].st_name;
- *stringtableIndex = m_shdr.sh_link;
- return true;
- }
+ if (compare(&m_symbols[index], addr, stringtableIndex, posIndex, offset, funcDescTable)) {
+ return true;
}
}
} else {
@@ -111,21 +118,8 @@
Elf_Sym sym;
for (int index = 0; index < count; index ++) {
if (fread(&sym, sym_size, 1, m_file) == 1) {
- if (STT_FUNC == ELF_ST_TYPE(sym.st_info)) {
- Elf_Word st_size = sym.st_size;
- address sym_addr;
- if (funcDescTable != NULL && funcDescTable->get_index() == sym.st_shndx) {
- // We need to go another step trough the function descriptor table (currently PPC64 only)
- sym_addr = funcDescTable->lookup(sym.st_value);
- } else {
- sym_addr = (address)sym.st_value;
- }
- if (sym_addr <= addr && (Elf_Word)(addr - sym_addr) < st_size) {
- *offset = (int)(addr - sym_addr);
- *posIndex = sym.st_name;
- *stringtableIndex = m_shdr.sh_link;
- return true;
- }
+ if (compare(&sym, addr, stringtableIndex, posIndex, offset, funcDescTable)) {
+ return true;
}
} else {
m_status = NullDecoder::file_invalid;
@@ -134,7 +128,7 @@
}
fseek(m_file, cur_pos, SEEK_SET);
}
- return true;
+ return false;
}
#endif // !_WINDOWS && !__APPLE__
--- a/hotspot/src/share/vm/utilities/elfSymbolTable.hpp Fri Dec 04 13:39:59 2015 +0300
+++ b/hotspot/src/share/vm/utilities/elfSymbolTable.hpp Wed Dec 02 06:00:18 2015 -0800
@@ -63,6 +63,8 @@
Elf_Shdr m_shdr;
NullDecoder::decoder_status m_status;
+
+ bool compare(const Elf_Sym* sym, address addr, int* stringtableIndex, int* posIndex, int* offset, ElfFuncDescTable* funcDescTable);
};
#endif // !_WINDOWS and !__APPLE__