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();
|
Stack<DataWord> stack = program.getStack();
|
||||||
|
|
||||||
String hint = "";
|
String hint = "";
|
||||||
long gasBefore = program.getGas().longValue();
|
|
||||||
int stepBefore = program.getPC();
|
int stepBefore = program.getPC();
|
||||||
|
|
||||||
// Log debugging line for VM
|
// Log debugging line for VM
|
||||||
|
@ -141,6 +140,9 @@ public class VM {
|
||||||
break;
|
break;
|
||||||
case CALL:
|
case CALL:
|
||||||
program.spendGas(GasCost.CALL, op.name());
|
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 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());
|
BigInteger y = stack.get(stack.size()-4).value().add(stack.get(stack.size()-5).value());
|
||||||
newMemSize = x.max(y);
|
newMemSize = x.max(y);
|
||||||
|
@ -326,7 +328,7 @@ public class VM {
|
||||||
DataWord word2 = program.stackPop();
|
DataWord word2 = program.stackPop();
|
||||||
|
|
||||||
if (logger.isInfoEnabled())
|
if (logger.isInfoEnabled())
|
||||||
hint = word1.value() + " < " + word2.value();
|
hint = word1.value() + " > " + word2.value();
|
||||||
|
|
||||||
if (word1.value().compareTo(word2.value()) == 1) {
|
if (word1.value().compareTo(word2.value()) == 1) {
|
||||||
word1.and(DataWord.ZERO);
|
word1.and(DataWord.ZERO);
|
||||||
|
@ -761,7 +763,8 @@ public class VM {
|
||||||
DataWord inSize = program.stackPop();
|
DataWord inSize = program.stackPop();
|
||||||
|
|
||||||
if (logger.isInfoEnabled())
|
if (logger.isInfoEnabled())
|
||||||
logger.info(logString, program.getPC(), op.name(),
|
logger.info(logString, program.getPC(),
|
||||||
|
String.format("%-12s", op.name()),
|
||||||
program.getGas().value(),
|
program.getGas().value(),
|
||||||
program.invokeData.getCallDeep(), hint);
|
program.invokeData.getCallDeep(), hint);
|
||||||
|
|
||||||
|
@ -781,7 +784,8 @@ public class VM {
|
||||||
DataWord outDataSize = program.stackPop();
|
DataWord outDataSize = program.stackPop();
|
||||||
|
|
||||||
if (logger.isInfoEnabled())
|
if (logger.isInfoEnabled())
|
||||||
logger.info(logString, program.getPC(), op.name(),
|
logger.info(logString, program.getPC(),
|
||||||
|
String.format("%-12s", op.name()),
|
||||||
program.getGas().value(),
|
program.getGas().value(),
|
||||||
program.invokeData.getCallDeep(), hint);
|
program.invokeData.getCallDeep(), hint);
|
||||||
|
|
||||||
|
@ -817,7 +821,7 @@ public class VM {
|
||||||
|
|
||||||
if (logger.isInfoEnabled() && !op.equals(CALL)
|
if (logger.isInfoEnabled() && !op.equals(CALL)
|
||||||
&& !op.equals(CREATE))
|
&& !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.invokeData.getCallDeep(), hint);
|
||||||
|
|
||||||
// program.fullTrace();
|
// program.fullTrace();
|
||||||
|
|
Loading…
Reference in New Issue