From 257bd7cf01223d0fa655ca433e70c6780e15ce78 Mon Sep 17 00:00:00 2001 From: tjchern Date: Wed, 29 May 2019 10:49:04 +0800 Subject: [PATCH] fix the bug: contract A create contract B, after A suicide, when call B's function, null pointer. --- src/main/java/org/tron/common/runtime/RuntimeImpl.java | 5 +++++ src/main/java/org/tron/core/capsule/ReceiptCapsule.java | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/org/tron/common/runtime/RuntimeImpl.java b/src/main/java/org/tron/common/runtime/RuntimeImpl.java index 86f2c13fb8b..da60f37ad51 100644 --- a/src/main/java/org/tron/common/runtime/RuntimeImpl.java +++ b/src/main/java/org/tron/common/runtime/RuntimeImpl.java @@ -315,6 +315,11 @@ public long getTotalEnergyLimitWithFixRatio(AccountCapsule creator, AccountCapsu public long getTotalEnergyLimit(AccountCapsule creator, AccountCapsule caller, TriggerSmartContract contract, long feeLimit, long callValue) throws ContractValidateException { + if (VMConfig.allowTvmConstantinople()) { + if (Objects.isNull(creator)) { + return getAccountEnergyLimitWithFixRatio(caller, feeLimit, callValue); + } + } // according to version if (VMConfig.getEnergyLimitHardFork()) { return getTotalEnergyLimitWithFixRatio(creator, caller, contract, feeLimit, callValue); diff --git a/src/main/java/org/tron/core/capsule/ReceiptCapsule.java b/src/main/java/org/tron/core/capsule/ReceiptCapsule.java index 166eb99dc23..fdf58b0875d 100644 --- a/src/main/java/org/tron/core/capsule/ReceiptCapsule.java +++ b/src/main/java/org/tron/core/capsule/ReceiptCapsule.java @@ -1,5 +1,6 @@ package org.tron.core.capsule; +import java.util.Objects; import lombok.Getter; import lombok.Setter; import org.tron.common.runtime.config.VMConfig; @@ -105,6 +106,13 @@ public void payEnergyBill(Manager manager, AccountCapsule origin, AccountCapsule return; } + if (VMConfig.allowTvmConstantinople()) { + if (Objects.isNull(origin)) { + payEnergyBill(manager, caller, receipt.getEnergyUsageTotal(), energyProcessor, now); + return; + } + } + if (caller.getAddress().equals(origin.getAddress())) { payEnergyBill(manager, caller, receipt.getEnergyUsageTotal(), energyProcessor, now); } else {