From 247005edd55e17a5ee4f07be9b1f2581e754918a Mon Sep 17 00:00:00 2001 From: Ronald Caesar Date: Mon, 15 Jun 2026 03:18:55 -0400 Subject: [PATCH] tests/x86/assembler: check for buffer overflows Signed-off-by: Ronald Caesar --- tests/backend/x86/test_x86_assembler.cpp | 85 ++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/tests/backend/x86/test_x86_assembler.cpp b/tests/backend/x86/test_x86_assembler.cpp index 3880cc0d..af08938d 100644 --- a/tests/backend/x86/test_x86_assembler.cpp +++ b/tests/backend/x86/test_x86_assembler.cpp @@ -311,6 +311,91 @@ TEST_F(Backendx86Assembler, Public_InvalidRegister_NoEmit) TEST_F(Backendx86Assembler, Public_FullBuffer_NoEmit) { + assembler.offset = sizeof(buffer); + + bal_x86_emit_add_mem64_rbp_offset_imm(&assembler, 0, 0x1); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_add_r64_imm32(&assembler, BAL_X86_RAX, 0x1); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_add_r64_r64(&assembler, BAL_X86_RAX, BAL_X86_RAX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_and_r64_r64(&assembler, BAL_X86_RAX, BAL_X86_RAX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_jcc_rel32(&assembler, BAL_X86_COND_A, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_jmp_r64(&assembler, BAL_X86_RAX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_jmp_rel32(&assembler, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_load_r64_rbp_offset(&assembler, BAL_X86_RAX, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_mov_r64_r64(&assembler, BAL_X86_RAX, BAL_X86_RBX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_mov_r64_imm64(&assembler, BAL_X86_RAX, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_or_r64_r64(&assembler, BAL_X86_RAX, BAL_X86_RBP); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_pop_r64(&assembler, BAL_X86_RAX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_push_r64(&assembler, BAL_X86_RAX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_setcc_mem8_rbp_offset(&assembler, BAL_X86_COND_A, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_store_r64_rbp_offset(&assembler, BAL_X86_RAX, 0); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_sub_r64_r64(&assembler, BAL_X86_RAX, BAL_X86_RBX); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); + + assembler.status = BAL_SUCCESS; + bal_x86_emit_ret(&assembler); + EXPECT_EQ(assembler.status, BAL_ERROR_INSTRUCTION_OVERFLOW); + EXPECT_EQ(assembler.offset, sizeof(buffer)); } TEST_F(Backendx86Assembler, Encode_Ret)