From 37e765daa6dafddec538e7778fe0ff327f453ce2 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Wed, 27 Jul 2022 12:17:16 -0600 Subject: [PATCH] fix: cosmovisor: fix (*Config.SetCurrentUpgrade file leak on failed JSON marshal+write (#12750) --- cosmovisor/args.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/cosmovisor/args.go b/cosmovisor/args.go index af16586c91..b50120c36d 100644 --- a/cosmovisor/args.go +++ b/cosmovisor/args.go @@ -271,7 +271,7 @@ func (cfg *Config) validate() []error { } // SetCurrentUpgrade sets the named upgrade to be the current link, returns error if this binary doesn't exist -func (cfg *Config) SetCurrentUpgrade(u upgradetypes.Plan) error { +func (cfg *Config) SetCurrentUpgrade(u upgradetypes.Plan) (rerr error) { // ensure named upgrade exists bin := cfg.UpgradeBin(u.Name) @@ -299,14 +299,19 @@ func (cfg *Config) SetCurrentUpgrade(u upgradetypes.Plan) error { if err != nil { return err } + defer func() { + cerr := f.Close() + if rerr == nil { + rerr = cerr + } + }() + bz, err := json.Marshal(u) if err != nil { return err } - if _, err := f.Write(bz); err != nil { - return err - } - return f.Close() + _, err = f.Write(bz) + return err } func (cfg *Config) UpgradeInfo() (upgradetypes.Plan, error) {