From b16fe2bee34fd0addbdda7f99369e165c19b76e0 Mon Sep 17 00:00:00 2001 From: sBubshait Date: Thu, 6 Jun 2024 16:34:38 +0100 Subject: [PATCH] Fixed Bug: Struct Undefined Behaviour Due to Unguarded Access --- src/execute.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/execute.c b/src/execute.c index 180487e..8ce5e79 100644 --- a/src/execute.c +++ b/src/execute.c @@ -389,11 +389,19 @@ void execute_SDT(Machine *state, a64inst_instruction *inst) { } else { state->registers[inst->data.SingleTransferData.target] = readDoubleWord(state->memory, address); } + + // Update base register if post indexed + bool isSDT = inst->data.SingleTransferData.SingleTransferOpType == a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER; + if (isSDT && inst->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode == a64inst_POST_INDEXED) { + dword result = address + signExtend(inst->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset, 9); + writeRegister(state, inst->data.SingleTransferData.processOpData.singleDataTransferData.base, inst->data.SingleTransferData.regType, result); + } } else { *(word *)(state->memory + address) = state->registers[inst->data.SingleTransferData.target]; // Update base register if post indexed - if (inst->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode == a64inst_POST_INDEXED) { + bool isSDT = inst->data.SingleTransferData.SingleTransferOpType == a64inst_SINGLE_TRANSFER_SINGLE_DATA_TRANSFER; + if (isSDT && inst->data.SingleTransferData.processOpData.singleDataTransferData.addressingMode == a64inst_POST_INDEXED) { dword result = address + signExtend(inst->data.SingleTransferData.processOpData.singleDataTransferData.a64inst_addressingModeData.indexedOffset, 9); writeRegister(state, inst->data.SingleTransferData.processOpData.singleDataTransferData.base, inst->data.SingleTransferData.regType, result); }