From 9cb0e0f1d7770282eda4018b0efd789a2c4e9bfd Mon Sep 17 00:00:00 2001 From: potato <30723680+0verflowme@users.noreply.github.com> Date: Sat, 20 Dec 2025 13:37:42 +0530 Subject: [PATCH] Fix aaef corrupting files in write mode by routing ESIL writes to IO overlay ##analysis --- libr/core/canal.c | 5 +++++ test/db/anal/arm-esil | 3 +-- test/db/io/write | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/libr/core/canal.c b/libr/core/canal.c index 81be2a9fca..617ce57f4f 100644 --- a/libr/core/canal.c +++ b/libr/core/canal.c @@ -5863,7 +5863,12 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char * ut64 fs = r_anal_function_realsize (fcn); if (ls > fs + 4096) { R_LOG_INFO ("Function is too sparse, must be analyzed with recursive"); + // `aaef` (analysis) must not modify the opened file even in `-w` mode. + // Route ESIL writes to the IO overlay temporarily for this recursive pass. + bool (*old_write_at)(RIO *io, ut64 addr, const ut8 *buf, int len) = core->anal->iob.write_at; + core->anal->iob.write_at = r_io_vwrite_to_overlay_at; r_core_anal_esil_function (core, core->addr); + core->anal->iob.write_at = old_write_at; return; } start = r_anal_function_min_addr (fcn); diff --git a/test/db/anal/arm-esil b/test/db/anal/arm-esil index 5ac776473e..a15f611ca1 100644 --- a/test/db/anal/arm-esil +++ b/test/db/anal/arm-esil @@ -12,7 +12,7 @@ EOF EXPECT=<