Fixed Bug: Struct Undefined Behaviour Due to Unguarded Access

This commit is contained in:
sBubshait 2024-06-06 16:34:38 +01:00
parent 4689aba219
commit b16fe2bee3

View File

@ -389,11 +389,19 @@ void execute_SDT(Machine *state, a64inst_instruction *inst) {
} else { } else {
state->registers[inst->data.SingleTransferData.target] = readDoubleWord(state->memory, address); 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 { } else {
*(word *)(state->memory + address) = state->registers[inst->data.SingleTransferData.target]; *(word *)(state->memory + address) = state->registers[inst->data.SingleTransferData.target];
// Update base register if post indexed // 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); 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); writeRegister(state, inst->data.SingleTransferData.processOpData.singleDataTransferData.base, inst->data.SingleTransferData.regType, result);
} }