fix: guard against self beneficiary when deleting actor
This commit is contained in:
parent
470538b082
commit
dff88b63b2
@ -266,7 +266,7 @@ func (rt *Runtime) CreateActor(codeID cid.Cid, address address.Address) {
|
|||||||
|
|
||||||
// DeleteActor deletes the executing actor from the state tree, transferring
|
// DeleteActor deletes the executing actor from the state tree, transferring
|
||||||
// any balance to beneficiary.
|
// any balance to beneficiary.
|
||||||
// Aborts if the beneficiary does not exist.
|
// Aborts if the beneficiary does not exist or is the calling actor.
|
||||||
// May only be called by the actor itself.
|
// May only be called by the actor itself.
|
||||||
func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
||||||
rt.chargeGas(rt.Pricelist().OnDeleteActor())
|
rt.chargeGas(rt.Pricelist().OnDeleteActor())
|
||||||
@ -278,6 +278,9 @@ func (rt *Runtime) DeleteActor(beneficiary address.Address) {
|
|||||||
panic(aerrors.Fatalf("failed to get actor: %s", err))
|
panic(aerrors.Fatalf("failed to get actor: %s", err))
|
||||||
}
|
}
|
||||||
if !act.Balance.IsZero() {
|
if !act.Balance.IsZero() {
|
||||||
|
if beneficiary == rt.Receiver() && rt.NetworkVersion() >= network.Version7 {
|
||||||
|
rt.Abortf(exitcode.SysErrorIllegalArgument, "benefactor cannot be beneficiary")
|
||||||
|
}
|
||||||
// Transfer the executing actor's balance to the beneficiary
|
// Transfer the executing actor's balance to the beneficiary
|
||||||
if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance); err != nil {
|
if err := rt.vm.transfer(rt.Receiver(), beneficiary, act.Balance); err != nil {
|
||||||
panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err))
|
panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err))
|
||||||
|
Loading…
Reference in New Issue
Block a user