Guard CALL against high initial gas price and overflow

This commit is contained in:
nicksavers 2014-08-24 11:38:27 +02:00
parent 4b722c9aa7
commit 7454d99b60
1 changed files with 9 additions and 5 deletions

View File

@ -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();