Skip to content

Commit 6b32cbb

Browse files
authored
Fix xref cleanup ordering ##crash
1 parent cb8192b commit 6b32cbb

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

libr/anal/anal.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ R_API void r_anal_free(RAnal *a) {
301301
r_bitset_free (a->visited);
302302
}
303303
r_anal_hint_storage_fini (a);
304+
r_anal_xrefs_free (a);
304305
r_th_lock_free (a->lock);
305306
r_interval_tree_fini (&a->meta);
306307
r_unref (a->config);
@@ -315,7 +316,6 @@ R_API void r_anal_free(RAnal *a) {
315316
r_anal_pin_fini (a);
316317
r_syscall_free (a->syscall);
317318
r_unref (a->reg);
318-
r_anal_xrefs_free (a);
319319
r_list_free (a->threads);
320320
r_list_free (a->leaddrs);
321321
sdb_free (a->sdb);
@@ -534,6 +534,7 @@ R_API void r_anal_purge(RAnal *anal) {
534534
sdb_reset (anal->sdb_cc);
535535
r_list_free (anal->fcns);
536536
anal->fcns = r_list_newf ((RListFree)r_anal_function_free);
537+
(void)r_anal_xrefs_init (anal);
537538
r_anal_purge_imports (anal);
538539
}
539540

test/unit/test_anal_xrefs.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,26 @@ bool test_r_anal_xrefs_count(void) {
1818
mu_end;
1919
}
2020

21+
bool test_r_anal_purge_clears_xrefs(void) {
22+
RAnal *anal = r_anal_new ();
23+
24+
mu_assert_true (r_anal_xrefs_set (anal, 0x1000, 0x2000, R_ANAL_REF_TYPE_CODE),
25+
"add xref before purge");
26+
mu_assert_eq (r_anal_xrefs_count (anal), 1, "xref exists before purge");
27+
28+
r_anal_purge (anal);
29+
mu_assert_eq (r_anal_xrefs_count (anal), 0, "purge clears xrefs");
30+
mu_assert_true (r_anal_xrefs_set (anal, 0x3000, 0x4000, R_ANAL_REF_TYPE_CALL),
31+
"xref manager remains usable after purge");
32+
mu_assert_eq (r_anal_xrefs_count (anal), 1, "xref added after purge");
33+
34+
r_anal_free (anal);
35+
mu_end;
36+
}
37+
2138
int all_tests(void) {
2239
mu_run_test (test_r_anal_xrefs_count);
40+
mu_run_test (test_r_anal_purge_clears_xrefs);
2341
return tests_passed != tests_run;
2442
}
2543

0 commit comments

Comments
 (0)