Guard CALL against high initial gas price and overflow
This commit is contained in:
parent
4b722c9aa7
commit
7454d99b60
|
@ -79,7 +79,6 @@ public class VM {
|
|||
Stack<DataWord> stack = program.getStack();
|
||||
|
||||
String hint = "";
|
||||
long gasBefore = program.getGas().longValue();
|
||||
int stepBefore = program.getPC();
|
||||
|
||||
// Log debugging line for VM
|
||||
|
@ -141,6 +140,9 @@ public class VM {
|
|||
break;
|
||||
case CALL:
|
||||
program.spendGas(GasCost.CALL, op.name());
|
||||
if(stack.get(stack.size()-1).value().compareTo(MAX_GAS) == 1) {
|
||||
throw program.new OutOfGasException(); // protect against overflow (needs refactoring)
|
||||
}
|
||||
BigInteger x = stack.get(stack.size()-6).value().add(stack.get(stack.size()-7).value());
|
||||
BigInteger y = stack.get(stack.size()-4).value().add(stack.get(stack.size()-5).value());
|
||||
newMemSize = x.max(y);
|
||||
|
@ -326,7 +328,7 @@ public class VM {
|
|||
DataWord word2 = program.stackPop();
|
||||
|
||||
if (logger.isInfoEnabled())
|
||||
hint = word1.value() + " < " + word2.value();
|
||||
hint = word1.value() + " > " + word2.value();
|
||||
|
||||
if (word1.value().compareTo(word2.value()) == 1) {
|
||||
word1.and(DataWord.ZERO);
|
||||
|
@ -761,7 +763,8 @@ public class VM {
|
|||
DataWord inSize = program.stackPop();
|
||||
|
||||
if (logger.isInfoEnabled())
|
||||
logger.info(logString, program.getPC(), op.name(),
|
||||
logger.info(logString, program.getPC(),
|
||||
String.format("%-12s", op.name()),
|
||||
program.getGas().value(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
|
||||
|
@ -781,7 +784,8 @@ public class VM {
|
|||
DataWord outDataSize = program.stackPop();
|
||||
|
||||
if (logger.isInfoEnabled())
|
||||
logger.info(logString, program.getPC(), op.name(),
|
||||
logger.info(logString, program.getPC(),
|
||||
String.format("%-12s", op.name()),
|
||||
program.getGas().value(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
|
||||
|
@ -817,7 +821,7 @@ public class VM {
|
|||
|
||||
if (logger.isInfoEnabled() && !op.equals(CALL)
|
||||
&& !op.equals(CREATE))
|
||||
logger.info(logString, stepBefore, String.format("%-12s", op.name()), gasBefore,
|
||||
logger.info(logString, stepBefore, String.format("%-12s", op.name()), program.getGas().longValue(),
|
||||
program.invokeData.getCallDeep(), hint);
|
||||
|
||||
// program.fullTrace();
|
||||
|
|
Loading…
Reference in New Issue