From c738768e41153b8e598ef51aa57530cf71c19880 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 9 Oct 2025 16:05:13 -0700 Subject: [PATCH] demon/win32: do not assume `actual_read` is valid after a failed process memory read --- src/ctrl/ctrl_core.c | 2 +- src/demon/win32/demon_core_win32.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 3ef242a7..4f922e78 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -6095,7 +6095,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 //- rjf: read successful, OR we have no history -> submit to hash store U128 hash = {0}; - if((zero_terminated_size > 0 || !key_has_history) && range_size != 0 && pre_read_mem_gen == post_read_mem_gen) + if((zero_terminated_size > 0 || !key_has_history) && range_base != 0 && range_size != 0 && pre_read_mem_gen == post_read_mem_gen) { hash = c_submit_data(content_key, &range_arena, str8((U8 *)range_base, zero_terminated_size)); gen_out[0] = pre_read_mem_gen; diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index ea1f3118..8ccf1fa7 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -322,7 +322,9 @@ dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) { DWORD error = GetLastError(); log_infof("'Win32 ReadProcessMemory failure': { [0x%I64x, 0x%I64x), code: %i }\n", range.min, range.max, error); - bytes_read += actual_read; + // NOTE(rjf): I have discovered that `actual_read` is *NOT* guaranteed to have + // a usable value if `ReadProcessMemory` fails! + // bytes_read += actual_read; (void)error; break; }