Modernize 'segment' implementation

This commit is contained in:
Serge Lamikhov-Center 2022-08-31 22:13:18 +03:00
parent 847249dd27
commit c22276ec1a
2 changed files with 29 additions and 33 deletions

View File

@ -272,8 +272,8 @@ template <class T> class section_impl : public section
std::string name; std::string name;
std::unique_ptr<char> data; std::unique_ptr<char> data;
Elf_Word data_size = 0; Elf_Word data_size = 0;
const endianess_convertor* convertor = 0; const endianess_convertor* convertor = nullptr;
const address_translator* translator = 0; const address_translator* translator = nullptr;
bool is_address_set = false; bool is_address_set = false;
size_t stream_size = 0; size_t stream_size = 0;
}; };

View File

@ -74,15 +74,10 @@ template <class T> class segment_impl : public segment
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
segment_impl( const endianess_convertor* convertor, segment_impl( const endianess_convertor* convertor,
const address_translator* translator ) const address_translator* translator )
: index( 0 ), data( nullptr ), convertor( convertor ), : convertor( convertor ), translator( translator )
translator( translator ), stream_size( 0 ), is_offset_set( false )
{ {
std::fill_n( reinterpret_cast<char*>( &ph ), sizeof( ph ), '\0' );
} }
//------------------------------------------------------------------------------
~segment_impl() override { delete[] data; }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Section info functions // Section info functions
ELFIO_GET_SET_ACCESS( Elf_Word, type, ph.p_type ); ELFIO_GET_SET_ACCESS( Elf_Word, type, ph.p_type );
@ -98,7 +93,7 @@ template <class T> class segment_impl : public segment
Elf_Half get_index() const override { return index; } Elf_Half get_index() const override { return index; }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
const char* get_data() const override { return data; } const char* get_data() const override { return data.get(); }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Elf_Half add_section_index( Elf_Half sec_index, Elf_Half add_section_index( Elf_Half sec_index,
@ -162,7 +157,7 @@ template <class T> class segment_impl : public segment
bool load( std::istream& stream, std::streampos header_offset ) override bool load( std::istream& stream, std::streampos header_offset ) override
{ {
if ( translator->empty() ) { if ( translator->empty() ) {
stream.seekg( 0, stream.end ); stream.seekg( 0, std::istream::end );
set_stream_size( size_t( stream.tellg() ) ); set_stream_size( size_t( stream.tellg() ) );
} }
else { else {
@ -173,7 +168,10 @@ template <class T> class segment_impl : public segment
stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) ); stream.read( reinterpret_cast<char*>( &ph ), sizeof( ph ) );
is_offset_set = true; is_offset_set = true;
if ( PT_NULL != get_type() && 0 != get_file_size() ) { if ( PT_NULL == get_type() || 0 == get_file_size() ) {
return true;
}
stream.seekg( ( *translator )[( *convertor )( ph.p_offset )] ); stream.seekg( ( *translator )[( *convertor )( ph.p_offset )] );
Elf_Xword size = get_file_size(); Elf_Xword size = get_file_size();
@ -181,17 +179,15 @@ template <class T> class segment_impl : public segment
data = nullptr; data = nullptr;
} }
else { else {
data = new ( std::nothrow ) char[(size_t)size + 1]; data.reset( new ( std::nothrow ) char[(size_t)size + 1] );
if ( nullptr != data ) { if ( nullptr != data.get() ) {
stream.read( data, size ); stream.read( data.get(), size );
if ( static_cast<Elf_Xword>( stream.gcount() ) != size ) { if ( static_cast<Elf_Xword>( stream.gcount() ) != size ) {
delete[] data;
data = nullptr; data = nullptr;
return false; return false;
} }
data[size] = 0; data.get()[size] = 0;
}
} }
} }
@ -217,14 +213,14 @@ template <class T> class segment_impl : public segment
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
private: private:
T ph; T ph = { 0 };
Elf_Half index; Elf_Half index = 0;
char* data; std::unique_ptr<char> data;
std::vector<Elf_Half> sections; std::vector<Elf_Half> sections;
const endianess_convertor* convertor; const endianess_convertor* convertor = nullptr;
const address_translator* translator; const address_translator* translator = nullptr;
size_t stream_size; size_t stream_size = 0;
bool is_offset_set; bool is_offset_set = false;
}; };
} // namespace ELFIO } // namespace ELFIO