From 58dc8d0c9b9b6a880a3ee46b51e49d815f770b8d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 1 Sep 2022 21:44:49 +0300 Subject: [PATCH] *: always close the wallet after use Fix #2631. --- cli/smartcontract/manifest.go | 3 ++- cli/smartcontract/smart_contract.go | 2 ++ cli/wallet/multisig.go | 1 + cli/wallet/nep17.go | 6 ++++++ cli/wallet/validator.go | 1 + cli/wallet/wallet.go | 12 ++++++++++++ pkg/consensus/consensus.go | 1 + pkg/services/notary/notary.go | 1 + pkg/services/oracle/oracle.go | 1 + pkg/services/stateroot/validators.go | 1 + pkg/smartcontract/doc_test.go | 1 + 11 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cli/smartcontract/manifest.go b/cli/smartcontract/manifest.go index a20325208..3964ae1a9 100644 --- a/cli/smartcontract/manifest.go +++ b/cli/smartcontract/manifest.go @@ -37,10 +37,11 @@ func manifestAddGroup(ctx *cli.Context) error { h := state.CreateContractHash(sender, nf.Checksum, m.Name) - gAcc, _, err := getAccFromContext(ctx) + gAcc, w, err := getAccFromContext(ctx) if err != nil { return cli.NewExitError(fmt.Errorf("can't get account to sign group with: %w", err), 1) } + defer w.Close() var found bool diff --git a/cli/smartcontract/smart_contract.go b/cli/smartcontract/smart_contract.go index fd39fba8f..009cf94e0 100644 --- a/cli/smartcontract/smart_contract.go +++ b/cli/smartcontract/smart_contract.go @@ -650,6 +650,7 @@ func invokeInternal(ctx *cli.Context, signAndPush bool) error { if err != nil { return cli.NewExitError(err, 1) } + defer w.Close() } _, err = invokeWithArgs(ctx, acc, w, script, operation, params, cosigners) @@ -949,6 +950,7 @@ func contractDeploy(ctx *cli.Context) error { if err != nil { return cli.NewExitError(fmt.Errorf("can't get sender address: %w", err), 1) } + defer w.Close() cosigners, sgnErr := cmdargs.GetSignersFromContext(ctx, signOffset) if sgnErr != nil { diff --git a/cli/wallet/multisig.go b/cli/wallet/multisig.go index 8b691fd43..2065af51f 100644 --- a/cli/wallet/multisig.go +++ b/cli/wallet/multisig.go @@ -25,6 +25,7 @@ func signStoredTransaction(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() pc, err := paramcontext.Read(ctx.String("in")) if err != nil { diff --git a/cli/wallet/nep17.go b/cli/wallet/nep17.go index 94077b9ab..6a778cfa3 100644 --- a/cli/wallet/nep17.go +++ b/cli/wallet/nep17.go @@ -222,6 +222,7 @@ func getNEPBalance(ctx *cli.Context, standard string, accHandler func(*cli.Conte if err != nil { return cli.NewExitError(fmt.Errorf("bad wallet: %w", err), 1) } + defer wall.Close() addrFlag := ctx.Generic("address").(*flags.Address) if addrFlag.IsSet { @@ -387,6 +388,7 @@ func importNEPToken(ctx *cli.Context, standard string) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() tokenHashFlag := ctx.Generic("token").(*flags.Address) if !tokenHashFlag.IsSet { @@ -455,6 +457,7 @@ func printNEPInfo(ctx *cli.Context, standard string) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() if name := ctx.String("token"); name != "" { token, err := getMatchingToken(ctx, wall, name, standard) @@ -490,6 +493,7 @@ func removeNEPToken(ctx *cli.Context, standard string) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() token, err := getMatchingToken(ctx, wall, ctx.String("token"), standard) if err != nil { @@ -513,6 +517,7 @@ func multiTransferNEP17(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() fromFlag := ctx.Generic("from").(*flags.Address) from, err := getDefaultAddress(fromFlag, wall) @@ -608,6 +613,7 @@ func transferNEP(ctx *cli.Context, standard string) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() fromFlag := ctx.Generic("from").(*flags.Address) from, err := getDefaultAddress(fromFlag, wall) diff --git a/cli/wallet/validator.go b/cli/wallet/validator.go index ef4726e27..2bc246298 100644 --- a/cli/wallet/validator.go +++ b/cli/wallet/validator.go @@ -94,6 +94,7 @@ func handleNeoAction(ctx *cli.Context, mkTx func(*neo.Contract, util.Uint160, *w if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() addrFlag := ctx.Generic("address").(*flags.Address) if !addrFlag.IsSet { diff --git a/cli/wallet/wallet.go b/cli/wallet/wallet.go index 932cd0c64..54751fb84 100644 --- a/cli/wallet/wallet.go +++ b/cli/wallet/wallet.go @@ -347,6 +347,7 @@ func claimGas(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() addrFlag := ctx.Generic("address").(*flags.Address) if !addrFlag.IsSet { @@ -388,6 +389,7 @@ func changePassword(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() if len(wall.Accounts) == 0 { return cli.NewExitError("wallet has no accounts", 1) } @@ -483,6 +485,7 @@ func addAccount(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() if err := createAccount(wall, pass); err != nil { return cli.NewExitError(err, 1) @@ -496,6 +499,7 @@ func exportKeys(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() var addr string @@ -557,6 +561,7 @@ func importMultisig(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() m := ctx.Int("min") if ctx.NArg() < m { @@ -600,6 +605,7 @@ func importDeployed(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() rawHash := ctx.Generic("contract").(*flags.Address) if !rawHash.IsSet { @@ -656,6 +662,7 @@ func importWallet(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() acc, err := newAccountFromWIF(ctx.App.Writer, ctx.String("wif"), wall.Scrypt) if err != nil { @@ -688,6 +695,7 @@ func removeAccount(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() addr := ctx.Generic("address").(*flags.Address) if !addr.IsSet { @@ -734,6 +742,7 @@ func dumpWallet(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() if ctx.Bool("decrypt") { if pass == nil { password, err := input.ReadPassword(EnterPasswordPrompt) @@ -762,6 +771,7 @@ func dumpKeys(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() accounts := wall.Accounts addrFlag := ctx.Generic("address").(*flags.Address) @@ -812,6 +822,7 @@ func stripKeys(ctx *cli.Context) error { if err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() if !ctx.Bool("force") { fmt.Fprintln(ctx.App.Writer, "All private keys for all accounts will be removed from the wallet. This action is irreversible.") if ok := askForConsent(ctx.App.Writer); !ok { @@ -861,6 +872,7 @@ func createWallet(ctx *cli.Context) error { if err := createAccount(wall, pass); err != nil { return cli.NewExitError(err, 1) } + defer wall.Close() } fmtPrintWallet(ctx.App.Writer, wall) diff --git a/pkg/consensus/consensus.go b/pkg/consensus/consensus.go index 7e8523ebd..1c0fc2d23 100644 --- a/pkg/consensus/consensus.go +++ b/pkg/consensus/consensus.go @@ -276,6 +276,7 @@ func (s *service) Shutdown() { s.log.Info("stopping consensus service") close(s.quit) <-s.finished + s.wallet.Close() } } diff --git a/pkg/services/notary/notary.go b/pkg/services/notary/notary.go index f496902e9..c626fb854 100644 --- a/pkg/services/notary/notary.go +++ b/pkg/services/notary/notary.go @@ -222,6 +222,7 @@ func (n *Notary) Shutdown() { n.Config.Log.Info("stopping notary service") close(n.stopCh) <-n.done + n.wallet.Close() } // OnNewRequest is a callback method which is called after a new notary request is added to the notary request pool. diff --git a/pkg/services/oracle/oracle.go b/pkg/services/oracle/oracle.go index d765db731..6dbb8f692 100644 --- a/pkg/services/oracle/oracle.go +++ b/pkg/services/oracle/oracle.go @@ -191,6 +191,7 @@ func (o *Oracle) Shutdown() { close(o.close) o.ResponseHandler.Shutdown() <-o.done + o.wallet.Close() } // Start runs the oracle service in a separate goroutine. diff --git a/pkg/services/stateroot/validators.go b/pkg/services/stateroot/validators.go index fc1bd1db1..02ffe4343 100644 --- a/pkg/services/stateroot/validators.go +++ b/pkg/services/stateroot/validators.go @@ -74,6 +74,7 @@ func (s *service) Shutdown() { s.log.Info("stopping state validation service") close(s.stopCh) <-s.done + s.wallet.Close() } func (s *service) signAndSend(r *state.MPTRoot) error { diff --git a/pkg/smartcontract/doc_test.go b/pkg/smartcontract/doc_test.go index 4dfdda4ca..a74e411f8 100644 --- a/pkg/smartcontract/doc_test.go +++ b/pkg/smartcontract/doc_test.go @@ -33,6 +33,7 @@ func ExampleBuilder() { b.Reset() // Copy the old script above if you need it! w, _ := wallet.NewWalletFromFile("somewhere") + defer w.Close() // Assuming there is one Account inside a, _ := actor.NewSimple(c, w.Accounts[0]) from := w.Accounts[0].Contract.ScriptHash() // Assuming Contract is present.