mirror of
https://github.com/QuasarApp/ELFIO.git
synced 2025-05-03 23:19:33 +00:00
Check size for segment
Fix crash b82f05b0b25c8fdc98480e6d76b6d5f9164ae2bc Running: crash-b82f05b0b25c8fdc98480e6d76b6d5f9164ae2bc ==2850==WARNING: AddressSanitizer failed to allocate 0x400000004000001 bytes ==2850==AddressSanitizer's allocator is terminating the process instead of returning 0 ==2850==If you don't like this behavior set allocator_may_return_null=1 ==2850==AddressSanitizer CHECK failed: /home/alvaro/tools/llvm/llvm/projects/compiler-rt/lib/sanitizer_common/sanitizer_allocator.cc:22 1 "((0)) != (0)" (0x0, 0x0)
This commit is contained in:
parent
1a3cb25a7c
commit
bd5f2128ae
@ -92,6 +92,21 @@ class segment_impl : public segment
|
|||||||
ELFIO_GET_SET_ACCESS( Elf_Xword, file_size, ph.p_filesz );
|
ELFIO_GET_SET_ACCESS( Elf_Xword, file_size, ph.p_filesz );
|
||||||
ELFIO_GET_SET_ACCESS( Elf_Xword, memory_size, ph.p_memsz );
|
ELFIO_GET_SET_ACCESS( Elf_Xword, memory_size, ph.p_memsz );
|
||||||
ELFIO_GET_ACCESS( Elf64_Off, offset, ph.p_offset );
|
ELFIO_GET_ACCESS( Elf64_Off, offset, ph.p_offset );
|
||||||
|
size_t stream_size;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
const size_t
|
||||||
|
get_stream_size() const
|
||||||
|
{
|
||||||
|
return stream_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
set_stream_size(size_t value)
|
||||||
|
{
|
||||||
|
stream_size = value;
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
Elf_Half
|
Elf_Half
|
||||||
@ -176,6 +191,10 @@ class segment_impl : public segment
|
|||||||
load( std::istream& stream,
|
load( std::istream& stream,
|
||||||
std::streampos header_offset )
|
std::streampos header_offset )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
stream.seekg ( 0, stream.end );
|
||||||
|
set_stream_size ( stream.tellg() );
|
||||||
|
|
||||||
stream.seekg( header_offset );
|
stream.seekg( header_offset );
|
||||||
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
|
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
|
||||||
is_offset_set = true;
|
is_offset_set = true;
|
||||||
@ -183,14 +202,19 @@ class segment_impl : public segment
|
|||||||
if ( PT_NULL != get_type() && 0 != get_file_size() ) {
|
if ( PT_NULL != get_type() && 0 != get_file_size() ) {
|
||||||
stream.seekg( (*convertor)( ph.p_offset ) );
|
stream.seekg( (*convertor)( ph.p_offset ) );
|
||||||
Elf_Xword size = get_file_size();
|
Elf_Xword size = get_file_size();
|
||||||
try {
|
if ( size > get_stream_size() ) {
|
||||||
data = new char[size];
|
data = 0;
|
||||||
} catch (const std::bad_alloc&) {
|
} else {
|
||||||
data = 0;
|
try {
|
||||||
}
|
data = new char[size + 1];
|
||||||
if ( 0 != data ) {
|
} catch (const std::bad_alloc&) {
|
||||||
stream.read( data, size );
|
data = 0;
|
||||||
}
|
}
|
||||||
|
if ( 0 != data ) {
|
||||||
|
stream.read( data, size );
|
||||||
|
data[size] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user