1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Range check fixes in RollBackStackFrame_COFFFrameDescriptor

This commit is contained in:
Brian Fiete 2022-05-18 14:38:42 -07:00
parent 1b9e0490f2
commit 7cae591fe6

View file

@ -1907,12 +1907,14 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
case COFFFrameProgram::Command_T0: case COFFFrameProgram::Command_T0:
case COFFFrameProgram::Command_T1: case COFFFrameProgram::Command_T1:
case COFFFrameProgram::Command_RASearch: case COFFFrameProgram::Command_RASearch:
BF_ASSERT(stackPos < 8); if (stackPos >= 8)
return false;
stackCmds[stackPos++] = cmd; stackCmds[stackPos++] = cmd;
break; break;
case COFFFrameProgram::Command_Add: case COFFFrameProgram::Command_Add:
{ {
BF_ASSERT(stackPos >= 2); if (stackPos < 2)
return false;
addr_target lhs = _GetValue(stackPos - 2); addr_target lhs = _GetValue(stackPos - 2);
addr_target rhs = _GetValue(stackPos - 1); addr_target rhs = _GetValue(stackPos - 1);
stackPos -= 2; stackPos -= 2;
@ -1922,7 +1924,8 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
break; break;
case COFFFrameProgram::Command_Subtract: case COFFFrameProgram::Command_Subtract:
{ {
BF_ASSERT(stackPos >= 2); if (stackPos < 2)
return false;
addr_target lhs = _GetValue(stackPos - 2); addr_target lhs = _GetValue(stackPos - 2);
addr_target rhs = _GetValue(stackPos - 1); addr_target rhs = _GetValue(stackPos - 1);
stackPos -= 2; stackPos -= 2;
@ -1932,7 +1935,8 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
break; break;
case COFFFrameProgram::Command_Align: case COFFFrameProgram::Command_Align:
{ {
BF_ASSERT(stackPos >= 2); if (stackPos < 2)
return false;
addr_target lhs = _GetValue(stackPos - 2); addr_target lhs = _GetValue(stackPos - 2);
addr_target rhs = _GetValue(stackPos - 1); addr_target rhs = _GetValue(stackPos - 1);
stackPos -= 2; stackPos -= 2;
@ -1942,7 +1946,8 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
break; break;
case COFFFrameProgram::Command_Set: case COFFFrameProgram::Command_Set:
{ {
BF_ASSERT(stackPos >= 2); if (stackPos < 2)
return false;
addr_target rhs = _GetValue(stackPos - 1); addr_target rhs = _GetValue(stackPos - 1);
switch (stackCmds[stackPos - 2]) switch (stackCmds[stackPos - 2])
{ {
@ -1990,8 +1995,9 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
} }
break; break;
case COFFFrameProgram::Command_Deref: case COFFFrameProgram::Command_Deref:
{ {
BF_ASSERT(stackPos >= 1); if (stackPos < 1)
return false;
addr_target addr = _GetValue(stackPos - 1); addr_target addr = _GetValue(stackPos - 1);
stackPos--; stackPos--;
stackValues[stackPos] = mDebugger->ReadMemory<addr_target>(addr); stackValues[stackPos] = mDebugger->ReadMemory<addr_target>(addr);
@ -2000,6 +2006,8 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
break; break;
case COFFFrameProgram::Command_Value: case COFFFrameProgram::Command_Value:
{ {
if (stackPos >= 8)
return false;
addr_target val = *(addr_target*)cmdPtr; addr_target val = *(addr_target*)cmdPtr;
cmdPtr += 4; cmdPtr += 4;
stackValues[stackPos] = val; stackValues[stackPos] = val;
@ -2008,6 +2016,8 @@ bool DebugTarget::RollBackStackFrame_COFFFrameDescriptor(CPURegisters* registers
break; break;
case COFFFrameProgram::Command_Value8: case COFFFrameProgram::Command_Value8:
{ {
if (stackPos >= 8)
return false;
addr_target val = (uint8)*(cmdPtr++); addr_target val = (uint8)*(cmdPtr++);
stackValues[stackPos] = val; stackValues[stackPos] = val;
stackCmds[stackPos++] = COFFFrameProgram::Command_Value; stackCmds[stackPos++] = COFFFrameProgram::Command_Value;