summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-02-11 13:57:47 -0500
committerMason Reed <mason@vector35.com>2025-02-11 22:13:56 -0500
commitb546d0c8d8957064424f37f1cae7bc5fc3695f4a (patch)
tree809bad573aa08ba6611697cc9c2d4d4464b3c747 /architecture.cpp
parent127ab740841f6938e359650c742314a7f1185904 (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.cpp84
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);
}