Skip to content

Commit 884b088

Browse files
committed
Fixed invalid memory read/segfault
This patch fixes segfaults caused by invalid memory read during leafref links removal process. It is tight hash_table implementation, as hash_table removal of record can invalidate all other record pointers due to memory reallocation process
1 parent 2141fe0 commit 884b088

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

src/tree_data_free.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,20 @@ lyd_free_leafref_links_rec(struct lyd_leafref_links_rec *rec)
144144
{
145145
LY_ARRAY_COUNT_TYPE u;
146146
struct lyd_leafref_links_rec *rec2;
147+
const struct lyd_node_term *node;
147148

148149
assert(rec);
150+
node = rec->node;
149151

150152
/* remove links of leafref nodes */
151153
LY_ARRAY_FOR(rec->leafref_nodes, u) {
152154
if (lyd_get_or_create_leafref_links_record(rec->leafref_nodes[u], &rec2, 0) == LY_SUCCESS) {
153155
LY_ARRAY_REMOVE_VALUE(rec2->target_nodes, rec->node);
154156
if ((LY_ARRAY_COUNT(rec2->leafref_nodes) == 0) && (LY_ARRAY_COUNT(rec2->target_nodes) == 0)) {
155157
lyd_free_leafref_nodes(rec->leafref_nodes[u]);
158+
/* refresh current record pointer as previous operation might move the records within memory */
159+
lyd_get_or_create_leafref_links_record(node, &rec, 0);
160+
assert(rec);
156161
}
157162
}
158163
}
@@ -165,6 +170,9 @@ lyd_free_leafref_links_rec(struct lyd_leafref_links_rec *rec)
165170
LY_ARRAY_REMOVE_VALUE(rec2->leafref_nodes, rec->node);
166171
if ((LY_ARRAY_COUNT(rec2->leafref_nodes) == 0) && (LY_ARRAY_COUNT(rec2->target_nodes) == 0)) {
167172
lyd_free_leafref_nodes(rec->target_nodes[u]);
173+
/* refresh current record pointer as previous operation might move the records within memory */
174+
lyd_get_or_create_leafref_links_record(node, &rec, 0);
175+
assert(rec);
168176
}
169177
}
170178
}
@@ -187,6 +195,9 @@ lyd_free_leafref_nodes(const struct lyd_node_term *node)
187195

188196
/* free entry content */
189197
lyd_free_leafref_links_rec(rec);
198+
/* refresh current record pointer as previous operation might move the records within memory */
199+
lyd_get_or_create_leafref_links_record(node, &rec, 0);
200+
assert(rec);
190201

191202
/* free entry itself from hash table */
192203
ht = LYD_CTX(node)->leafref_links_ht;

0 commit comments

Comments
 (0)