summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-04-29 12:47:26 +0300
committerOxore <oxore@protonmail.com>2023-04-29 12:52:25 +0300
commit97118ecb195356650a4def44ba36d026634f3f95 (patch)
tree6429c0e672955777192bba8f27774abac877f7b2 /disasm.cpp
parente8db23a8b94edad65dfede4ae2077c6788e53de0 (diff)
Fix bound checking for (xxx).L extension bytes
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/disasm.cpp b/disasm.cpp
index d4aaa3a..d0424eb 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -196,7 +196,7 @@ constexpr AddrModeArg AddrModeArg::Fetch(
}
break;
case 1: // (xxx).L, Additional Long
- if (offset < code.occupied_size) {
+ if (offset + kInstructionSizeStepBytes < code.occupied_size) {
const int32_t l = GetI32BE(code.buffer + offset);
return AddrModeArg::Long(m, xn, l);
}
@@ -551,7 +551,7 @@ static void disasm_addq_subq(
}
break;
case 1: // 5x39 / 5x79 / 5xb9 (xxx).L
- if (node.offset + kInstructionSizeStepBytes < code.occupied_size) {
+ if (node.offset + kInstructionSizeStepBytes * 2 < code.occupied_size) {
node.size = kInstructionSizeStepBytes * 3;
snprintf(node.mnemonic, kMnemonicBufferSize, "%s%c", mnemonic, suffix);
const int32_t dispmt = GetI32BE(code.buffer + node.offset + kInstructionSizeStepBytes);
@@ -657,9 +657,9 @@ static void disasm_scc(
case 7: // 5xf8..5xff
switch (xn) {
case 0: // 5xf8 (xxx).W
- node.size = kInstructionSizeStepBytes * 2;
- snprintf(node.mnemonic, kMnemonicBufferSize, mnemonic);
if (node.offset + kInstructionSizeStepBytes < code.occupied_size) {
+ node.size = kInstructionSizeStepBytes * 2;
+ snprintf(node.mnemonic, kMnemonicBufferSize, mnemonic);
// This shit is real: it is sign extend value
const int32_t dispmt = GetI16BE(code.buffer + node.offset + kInstructionSizeStepBytes);
snprintf(node.arguments, kArgsBufferSize, "0x%x:w", dispmt);
@@ -667,9 +667,9 @@ static void disasm_scc(
}
break;
case 1: // 5xf9 (xxx).L
- node.size = kInstructionSizeStepBytes * 3;
- snprintf(node.mnemonic, kMnemonicBufferSize, mnemonic);
- if (node.offset + kInstructionSizeStepBytes < code.occupied_size) {
+ if (node.offset + kInstructionSizeStepBytes * 2 < code.occupied_size) {
+ node.size = kInstructionSizeStepBytes * 3;
+ snprintf(node.mnemonic, kMnemonicBufferSize, mnemonic);
const int32_t dispmt = GetI32BE(code.buffer + node.offset + kInstructionSizeStepBytes);
snprintf(node.arguments, kArgsBufferSize, "0x%x:l", dispmt);
return;