diff --git a/src/apps/debugger/dwarf/DataReader.h b/src/apps/debugger/dwarf/DataReader.h index ee1cab3d50..e6c2e8d765 100644 --- a/src/apps/debugger/dwarf/DataReader.h +++ b/src/apps/debugger/dwarf/DataReader.h @@ -36,6 +36,21 @@ public: fOverflow = false; } + DataReader RestrictedReader() + { + return *this; + } + + DataReader RestrictedReader(off_t maxLength) + { + return DataReader(fData, maxLength, fAddressSize); + } + + DataReader RestrictedReader(off_t relativeOffset, off_t maxLength) + { + return DataReader(fData + relativeOffset, maxLength, fAddressSize); + } + bool HasData() const { return fSize > 0; diff --git a/src/apps/debugger/dwarf/DwarfFile.cpp b/src/apps/debugger/dwarf/DwarfFile.cpp index 5cfb3a446d..3b2fe4548a 100644 --- a/src/apps/debugger/dwarf/DwarfFile.cpp +++ b/src/apps/debugger/dwarf/DwarfFile.cpp @@ -672,8 +672,10 @@ DwarfFile::UnwindCallFrame(CompilationUnit* unit, if (error != B_OK) return error; + DataReader restrictedReader = + dataReader.RestrictedReader(remaining); error = _ParseFrameInfoInstructions(unit, context, - dataReader.Offset(), remaining); + restrictedReader); if (error != B_OK) return error; @@ -1604,22 +1606,15 @@ DwarfFile::_ParseCIE(CompilationUnit* unit, CfaContext& context, if (remaining < 0) return B_BAD_DATA; - return _ParseFrameInfoInstructions(unit, context, - cieOffset + dataReader.Offset(), remaining); + DataReader restrictedReader = dataReader.RestrictedReader(remaining); + return _ParseFrameInfoInstructions(unit, context, restrictedReader); } status_t DwarfFile::_ParseFrameInfoInstructions(CompilationUnit* unit, - CfaContext& context, off_t instructionOffset, off_t instructionSize) + CfaContext& context, DataReader& dataReader) { - if (instructionSize <= 0) - return B_OK; - - DataReader dataReader( - (uint8*)fDebugFrameSection->Data() + instructionOffset, - instructionSize, unit->AddressSize()); - while (dataReader.BytesRemaining() > 0) { TRACE_CFI(" [%2lld]", dataReader.BytesRemaining()); diff --git a/src/apps/debugger/dwarf/DwarfFile.h b/src/apps/debugger/dwarf/DwarfFile.h index c6f8d196b1..a979c6fa9e 100644 --- a/src/apps/debugger/dwarf/DwarfFile.h +++ b/src/apps/debugger/dwarf/DwarfFile.h @@ -116,8 +116,7 @@ private: CIEAugmentation& cieAugmentation); status_t _ParseFrameInfoInstructions( CompilationUnit* unit, CfaContext& context, - off_t instructionOffset, - off_t instructionSize); + DataReader& dataReader); status_t _ParsePublicTypesInfo(); status_t _ParsePublicTypesInfo(DataReader& dataReader,