mirror of
https://github.com/serge1/ELFIO.git
synced 2025-04-16 05:42:31 +00:00
Validate size of entries before accessing members
Signed-off-by: Alan Jowett <alan.jowett@microsoft.com>
This commit is contained in:
parent
9814eaaa76
commit
182248f364
@ -96,26 +96,26 @@ template <class S> class relocation_section_accessor_template
|
|||||||
|
|
||||||
if ( elf_file.get_class() == ELFCLASS32 ) {
|
if ( elf_file.get_class() == ELFCLASS32 ) {
|
||||||
if ( SHT_REL == relocation_section->get_type() ) {
|
if ( SHT_REL == relocation_section->get_type() ) {
|
||||||
generic_get_entry_rel<Elf32_Rel>( index, offset, symbol, type,
|
return generic_get_entry_rel<Elf32_Rel>( index, offset, symbol, type,
|
||||||
addend );
|
addend );
|
||||||
}
|
}
|
||||||
else if ( SHT_RELA == relocation_section->get_type() ) {
|
else if ( SHT_RELA == relocation_section->get_type() ) {
|
||||||
generic_get_entry_rela<Elf32_Rela>( index, offset, symbol, type,
|
return generic_get_entry_rela<Elf32_Rela>( index, offset, symbol, type,
|
||||||
addend );
|
addend );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( SHT_REL == relocation_section->get_type() ) {
|
if ( SHT_REL == relocation_section->get_type() ) {
|
||||||
generic_get_entry_rel<Elf64_Rel>( index, offset, symbol, type,
|
return generic_get_entry_rel<Elf64_Rel>( index, offset, symbol, type,
|
||||||
addend );
|
addend );
|
||||||
}
|
}
|
||||||
else if ( SHT_RELA == relocation_section->get_type() ) {
|
else if ( SHT_RELA == relocation_section->get_type() ) {
|
||||||
generic_get_entry_rela<Elf64_Rela>( index, offset, symbol, type,
|
return generic_get_entry_rela<Elf64_Rela>( index, offset, symbol, type,
|
||||||
addend );
|
addend );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Unknown relocation section type.
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@ -319,7 +319,7 @@ template <class S> class relocation_section_accessor_template
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
template <class T>
|
template <class T>
|
||||||
void generic_get_entry_rel( Elf_Xword index,
|
bool generic_get_entry_rel( Elf_Xword index,
|
||||||
Elf64_Addr& offset,
|
Elf64_Addr& offset,
|
||||||
Elf_Word& symbol,
|
Elf_Word& symbol,
|
||||||
unsigned& type,
|
unsigned& type,
|
||||||
@ -327,6 +327,9 @@ template <class S> class relocation_section_accessor_template
|
|||||||
{
|
{
|
||||||
const endianess_convertor& convertor = elf_file.get_convertor();
|
const endianess_convertor& convertor = elf_file.get_convertor();
|
||||||
|
|
||||||
|
if (relocation_section->get_entry_size() < sizeof( T ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
const T* pEntry = reinterpret_cast<const T*>(
|
const T* pEntry = reinterpret_cast<const T*>(
|
||||||
relocation_section->get_data() +
|
relocation_section->get_data() +
|
||||||
index * relocation_section->get_entry_size() );
|
index * relocation_section->get_entry_size() );
|
||||||
@ -335,11 +338,12 @@ template <class S> class relocation_section_accessor_template
|
|||||||
symbol = get_sym_and_type<T>::get_r_sym( tmp );
|
symbol = get_sym_and_type<T>::get_r_sym( tmp );
|
||||||
type = get_sym_and_type<T>::get_r_type( tmp );
|
type = get_sym_and_type<T>::get_r_type( tmp );
|
||||||
addend = 0;
|
addend = 0;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
template <class T>
|
template <class T>
|
||||||
void generic_get_entry_rela( Elf_Xword index,
|
bool generic_get_entry_rela( Elf_Xword index,
|
||||||
Elf64_Addr& offset,
|
Elf64_Addr& offset,
|
||||||
Elf_Word& symbol,
|
Elf_Word& symbol,
|
||||||
unsigned& type,
|
unsigned& type,
|
||||||
@ -347,6 +351,10 @@ template <class S> class relocation_section_accessor_template
|
|||||||
{
|
{
|
||||||
const endianess_convertor& convertor = elf_file.get_convertor();
|
const endianess_convertor& convertor = elf_file.get_convertor();
|
||||||
|
|
||||||
|
if (relocation_section->get_entry_size() < sizeof( T ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const T* pEntry = reinterpret_cast<const T*>(
|
const T* pEntry = reinterpret_cast<const T*>(
|
||||||
relocation_section->get_data() +
|
relocation_section->get_data() +
|
||||||
index * relocation_section->get_entry_size() );
|
index * relocation_section->get_entry_size() );
|
||||||
@ -355,6 +363,7 @@ template <class S> class relocation_section_accessor_template
|
|||||||
symbol = get_sym_and_type<T>::get_r_sym( tmp );
|
symbol = get_sym_and_type<T>::get_r_sym( tmp );
|
||||||
type = get_sym_and_type<T>::get_r_type( tmp );
|
type = get_sym_and_type<T>::get_r_type( tmp );
|
||||||
addend = convertor( pEntry->r_addend );
|
addend = convertor( pEntry->r_addend );
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -395,6 +395,9 @@ template <class S> class symbol_section_accessor_template
|
|||||||
template <class T> const T* generic_get_symbol_ptr( Elf_Xword index ) const
|
template <class T> const T* generic_get_symbol_ptr( Elf_Xword index ) const
|
||||||
{
|
{
|
||||||
if ( 0 != symbol_section->get_data() && index < get_symbols_num() ) {
|
if ( 0 != symbol_section->get_data() && index < get_symbols_num() ) {
|
||||||
|
if ( symbol_section->get_entry_size() < sizeof( T ) ) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
const T* pSym = reinterpret_cast<const T*>(
|
const T* pSym = reinterpret_cast<const T*>(
|
||||||
symbol_section->get_data() +
|
symbol_section->get_data() +
|
||||||
index * symbol_section->get_entry_size() );
|
index * symbol_section->get_entry_size() );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user