diff options
| author | Mason Reed <mason@vector35.com> | 2025-02-11 13:57:47 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-11 22:13:56 -0500 |
| commit | b546d0c8d8957064424f37f1cae7bc5fc3695f4a (patch) | |
| tree | 809bad573aa08ba6611697cc9c2d4d4464b3c747 /architecture.cpp | |
| parent | 127ab740841f6938e359650c742314a7f1185904 (diff) | |
Fix partial initialization of `DisassemblyTextLine`
The usage of `DisassemblyTextLine` in the FFI was unsound, we would forget to initialize some fields causing a myriad of issues where round-tripping through the FFI was losing information.
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 84 |
1 files changed, 11 insertions, 73 deletions
diff --git a/architecture.cpp b/architecture.cpp index 450466da..6c43d5d8 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -24,6 +24,7 @@ #include <inttypes.h> #include <vector> #include "binaryninjaapi.h" +#include "ffi.h" using namespace BinaryNinja; using namespace std; @@ -2441,17 +2442,7 @@ bool DisassemblyTextRenderer::GetInstructionText(uint64_t addr, size_t& len, vec if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &result, &count)) return false; - for (size_t i = 0; i < count; i++) - { - DisassemblyTextLine line; - line.addr = result[i].addr; - line.instrIndex = result[i].instrIndex; - line.highlight = result[i].highlight; - line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count); - line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount); - lines.push_back(line); - } - + lines = ParseAPIObjectList<DisassemblyTextLine>(result, count); BNFreeDisassemblyTextLines(result, count); return true; } @@ -2460,41 +2451,15 @@ bool DisassemblyTextRenderer::GetInstructionText(uint64_t addr, size_t& len, vec vector<DisassemblyTextLine> DisassemblyTextRenderer::PostProcessInstructionTextLines( uint64_t addr, size_t len, const vector<DisassemblyTextLine>& lines, const string& indentSpaces) { - BNDisassemblyTextLine* inLines = new BNDisassemblyTextLine[lines.size()]; - for (size_t i = 0; i < lines.size(); i++) - { - inLines[i].addr = lines[i].addr; - inLines[i].instrIndex = lines[i].instrIndex; - inLines[i].highlight = lines[i].highlight; - inLines[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(lines[i].tokens); - inLines[i].count = lines[i].tokens.size(); - inLines[i].tags = Tag::CreateTagList(lines[i].tags, &inLines[i].tagCount); - } - + size_t inCount = 0; + BNDisassemblyTextLine* inLines = AllocAPIObjectList<DisassemblyTextLine>(lines, &inCount); BNDisassemblyTextLine* result = nullptr; size_t count = 0; result = BNPostProcessDisassemblyTextRendererLines( - m_object, addr, len, inLines, lines.size(), &count, indentSpaces.c_str()); - - for (size_t i = 0; i < lines.size(); i++) - { - InstructionTextToken::FreeInstructionTextTokenList(inLines[i].tokens, inLines[i].count); - Tag::FreeTagList(inLines[i].tags, inLines[i].tagCount); - } - delete[] inLines; - - vector<DisassemblyTextLine> outLines; - for (size_t i = 0; i < count; i++) - { - DisassemblyTextLine line; - line.addr = result[i].addr; - line.instrIndex = result[i].instrIndex; - line.highlight = result[i].highlight; - line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count); - line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount); - outLines.push_back(line); - } + m_object, addr, len, inLines, inCount, &count, indentSpaces.c_str()); + vector<DisassemblyTextLine> outLines = ParseAPIObjectList<DisassemblyTextLine>(result, count); + FreeAPIObjectList<DisassemblyTextLine>(inLines, inCount); BNFreeDisassemblyTextLines(result, count); return outLines; } @@ -2507,17 +2472,7 @@ bool DisassemblyTextRenderer::GetDisassemblyText(uint64_t addr, size_t& len, vec if (!BNGetDisassemblyTextRendererLines(m_object, addr, &len, &result, &count)) return false; - for (size_t i = 0; i < count; i++) - { - DisassemblyTextLine line; - line.addr = result[i].addr; - line.instrIndex = result[i].instrIndex; - line.highlight = result[i].highlight; - line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count); - line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount); - lines.push_back(line); - } - + lines = ParseAPIObjectList<DisassemblyTextLine>(result, count); BNFreeDisassemblyTextLines(result, count); return true; } @@ -2614,31 +2569,14 @@ void DisassemblyTextRenderer::AddIntegerToken( void DisassemblyTextRenderer::WrapComment(DisassemblyTextLine& line, vector<DisassemblyTextLine>& lines, const string& comment, bool hasAutoAnnotations, const string& leadingSpaces, const string& indentSpaces) { - BNDisassemblyTextLine inLine; - inLine.addr = line.addr; - inLine.instrIndex = line.instrIndex; - inLine.highlight = line.highlight; - inLine.count = line.tokens.size(); - inLine.tokens = InstructionTextToken::CreateInstructionTextTokenList(line.tokens); - inLine.tags = Tag::CreateTagList(line.tags, &inLine.tagCount); - + BNDisassemblyTextLine inLine = line.GetAPIObject(); size_t count = 0; BNDisassemblyTextLine* result = BNDisassemblyTextRendererWrapComment( m_object, &inLine, &count, comment.c_str(), hasAutoAnnotations, leadingSpaces.c_str(), indentSpaces.c_str()); - for (size_t i = 0; i < count; i++) - { - DisassemblyTextLine line; - line.addr = result[i].addr; - line.instrIndex = result[i].instrIndex; - line.highlight = result[i].highlight; - line.tokens = InstructionTextToken::ConvertInstructionTextTokenList(result[i].tokens, result[i].count); - line.tags = Tag::ConvertTagList(result[i].tags, result[i].tagCount); - lines.push_back(line); - } - + lines = ParseAPIObjectList<DisassemblyTextLine>(result, count); BNFreeDisassemblyTextLines(result, count); - BNFreeInstructionText(inLine.tokens, inLine.count); + DisassemblyTextLine::FreeAPIObject(&inLine); } |
