From bd6682a61d3f03d8656429c6875fba3fdea8b1ad Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Mon, 19 Aug 2024 08:48:30 +0300 Subject: [PATCH] fix bug when 1-byte opcode will trigger size-limit because of unnecessary bounds check --- src/rtdisasm.c | 8 ++++++-- src/rtdisasm_test.c | 5 +++-- src/rtdisasm_test_data.s | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/rtdisasm.c b/src/rtdisasm.c index 227adad..d939a47 100644 --- a/src/rtdisasm.c +++ b/src/rtdisasm.c @@ -312,11 +312,15 @@ int rtdisasm_analyze_single(const uint8_t* code, unsigned size, const instructio if (type == INSTRUCTION_STD) { if (ins->config.has_imm) + { cur += imm2length(ins->std.imm); + if (cur >= end) return -1; + } else if (ins->config.has_value) + { cur += value2length(ins->std.value); - - if (cur >= end) return -1; + if (cur >= end) return -1; + } } // set found diff --git a/src/rtdisasm_test.c b/src/rtdisasm_test.c index e8d4c92..70ff15e 100644 --- a/src/rtdisasm_test.c +++ b/src/rtdisasm_test.c @@ -7,8 +7,9 @@ extern void test_1_end(); int main() { size_t size = (uintptr_t)test_1_end - (uintptr_t)test_1; - int len = rtdisasm_analyze_single((const uint8_t*)test_1, size, NULL); - printf("rtdisasm_analyze_single: len %d\n", len); + printf("size %lu\n", size); + // int len = rtdisasm_analyze_single((const uint8_t*)test_1, size, NULL); + // printf("rtdisasm_analyze_single: len %d\n", len); int offset = rtdisasm_find_target((const uint8_t*)test_1, size, RT_TARGET_NOP); printf("rtdisasm_find_target: offset %d\n", offset); diff --git a/src/rtdisasm_test_data.s b/src/rtdisasm_test_data.s index 46d8fd2..c2368c8 100644 --- a/src/rtdisasm_test_data.s +++ b/src/rtdisasm_test_data.s @@ -3,6 +3,7 @@ .globl test_1_end test_1: + push %rax push (%rbp) nop # target that rtdisasm must reach