Skip to content

Commit 09d1f20

Browse files
authored
Merge pull request #2092 from verilog-to-routing/double_free_route_tree
Issue #2078
2 parents c504c40 + e736303 commit 09d1f20

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

vpr/src/route/route_tree_timing.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static t_linked_rt_edge* rt_edge_free_list = nullptr;
4545

4646
static t_rt_node* alloc_rt_node();
4747

48-
static void free_rt_node(t_rt_node* rt_node);
48+
static void free_rt_node(t_rt_node** rt_node);
4949

5050
static t_linked_rt_edge* alloc_linked_rt_edge();
5151

@@ -144,11 +144,15 @@ alloc_rt_node() {
144144
return (rt_node);
145145
}
146146

147-
static void free_rt_node(t_rt_node* rt_node) {
147+
/* After putting the rt_node to the free list, rt_node pointer would be set to
148+
* nullptr to make sure that it does not get double frees if a caller tries to
149+
* free the routing tree twice */
150+
static void free_rt_node(t_rt_node** rt_node) {
148151
/* Adds rt_node to the proper free list. */
149152

150-
rt_node->u.next = rt_node_free_list;
151-
rt_node_free_list = rt_node;
153+
(*rt_node)->u.next = rt_node_free_list;
154+
rt_node_free_list = (*rt_node);
155+
(*rt_node) = nullptr;
152156
}
153157

154158
static t_linked_rt_edge*
@@ -658,9 +662,9 @@ bool verify_route_tree_recurr(t_rt_node* node, std::set<int>& seen_nodes) {
658662
}
659663

660664
void free_route_tree(t_rt_node* rt_node) {
661-
/* Puts the rt_nodes and edges in the tree rooted at rt_node back on the
662-
* free lists. Recursive, depth-first post-order traversal. */
663-
665+
if (rt_node == nullptr) {
666+
return;
667+
}
664668
t_linked_rt_edge *rt_edge, *next_edge;
665669

666670
rt_edge = rt_node->u.child_list;
@@ -677,7 +681,7 @@ void free_route_tree(t_rt_node* rt_node) {
677681
rr_node_to_rt_node.at(rt_node->inode) = nullptr;
678682
}
679683

680-
free_rt_node(rt_node);
684+
free_rt_node(&rt_node);
681685
}
682686

683687
void print_route_tree(const t_rt_node* rt_node) {
@@ -1056,7 +1060,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf
10561060
//Record as not reached
10571061
connections_inf.toreach_rr_sink(node->net_pin_index);
10581062

1059-
free_rt_node(node);
1063+
free_rt_node(&node);
10601064
return nullptr; //Pruned
10611065
}
10621066
} else if (all_children_pruned) {
@@ -1102,7 +1106,7 @@ static t_rt_node* prune_route_tree_recurr(t_rt_node* node, CBRR& connections_inf
11021106
if (reached_non_configurably && !force_prune) {
11031107
return node; //Not pruned
11041108
} else {
1105-
free_rt_node(node);
1109+
free_rt_node(&node);
11061110
return nullptr; //Pruned
11071111
}
11081112

vpr/src/route/route_tree_timing.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ void free_route_tree_timing_structs();
1515

1616
t_rt_node* init_route_tree_to_source(ClusterNetId inet);
1717

18+
/*
19+
* Puts the rt_nodes and edges in the tree rooted at rt_node back on the
20+
* free lists. Recursive, depth-first post-order traversal.
21+
*/
1822
void free_route_tree(t_rt_node* rt_node);
1923
void print_route_tree(const t_rt_node* rt_node);
2024
void print_route_tree(const t_rt_node* rt_node, int depth);

0 commit comments

Comments
 (0)