From 453eb5bdc70513464c7137f910cba815289c97a0 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Fri, 26 Apr 2019 16:38:14 -0400 Subject: Don't let a node that hasn't been added to the graph be added as an edge target --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 2 ++ flowgraphnode.cpp | 6 ++++++ python/flowgraph.py | 5 +++++ 4 files changed, 15 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 6a4b1bc1..1b0232fc 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -2742,6 +2742,8 @@ namespace BinaryNinja BNHighlightColor GetHighlight() const; void SetHighlight(const BNHighlightColor& color); + + bool IsValidForGraph(FlowGraph* graph) const; }; class FlowGraphLayoutRequest: public RefCountObject diff --git a/binaryninjacore.h b/binaryninjacore.h index 8e355ab1..89b61202 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2948,6 +2948,8 @@ extern "C" BINARYNINJACOREAPI void BNSetFlowGraphOption(BNFlowGraph* graph, BNFlowGraphOption option, bool value); BINARYNINJACOREAPI bool BNIsFlowGraphOptionSet(BNFlowGraph* graph, BNFlowGraphOption option); + BINARYNINJACOREAPI bool BNIsNodeValidForFlowGraph(BNFlowGraph* graph, BNFlowGraphNode* node); + // Symbols BINARYNINJACOREAPI BNSymbol* BNCreateSymbol(BNSymbolType type, const char* shortName, const char* fullName, const char* rawName, uint64_t addr, BNSymbolBinding binding, const BNNameSpace* nameSpace, uint64_t ordinal); diff --git a/flowgraphnode.cpp b/flowgraphnode.cpp index 37128cd8..4a1729ff 100644 --- a/flowgraphnode.cpp +++ b/flowgraphnode.cpp @@ -208,3 +208,9 @@ void FlowGraphNode::SetHighlight(const BNHighlightColor& color) { BNSetFlowGraphNodeHighlight(m_object, color); } + + +bool FlowGraphNode::IsValidForGraph(FlowGraph* graph) const +{ + return BNIsNodeValidForFlowGraph(graph->GetObject(), m_object); +} diff --git a/python/flowgraph.py b/python/flowgraph.py index 3054ff35..58add8b0 100644 --- a/python/flowgraph.py +++ b/python/flowgraph.py @@ -268,8 +268,13 @@ class FlowGraphNode(object): :param BranchType edge_type: Type of edge to add :param FlowGraphNode target: Target node object """ + if not target.is_valid_for_graph(self.graph): + raise ValueError("Target of edge has not been added to the owning graph") core.BNAddFlowGraphNodeOutgoingEdge(self.handle, edge_type, target.handle) + def is_valid_for_graph(self, graph): + return core.BNIsNodeValidForFlowGraph(graph.handle, self.handle) + class FlowGraphLayoutRequest(object): def __init__(self, graph, callback = None): -- cgit v1.3.1