From 0d57d2b6d8c304c83f02384049cd38467a084904 Mon Sep 17 00:00:00 2001 From: Daniel Milde Date: Thu, 19 Aug 2021 22:38:33 +0200 Subject: [PATCH] check errors when closing files --- cmd/gdu/app/app.go | 44 ++++++++++++++++++++++++++--------------- pkg/device/dev_linux.go | 14 +++++++++++-- report/export.go | 5 ++++- tui/actions.go | 6 +++++- 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/cmd/gdu/app/app.go b/cmd/gdu/app/app.go index be536dfa7..3949d956c 100644 --- a/cmd/gdu/app/app.go +++ b/cmd/gdu/app/app.go @@ -63,36 +63,47 @@ type App struct { } // Run starts gdu main logic -func (a *App) Run() error { +func (a *App) Run() (err error) { + var ( + f *os.File + ui UI + ) + if a.Flags.ShowVersion { fmt.Fprintln(a.Writer, "Version:\t", build.Version) fmt.Fprintln(a.Writer, "Built time:\t", build.Time) fmt.Fprintln(a.Writer, "Built user:\t", build.User) - return nil + return } - f, err := os.OpenFile(a.Flags.LogFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + f, err = os.OpenFile(a.Flags.LogFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { - return fmt.Errorf("opening log file: %w", err) + err = fmt.Errorf("opening log file: %w", err) + return } - defer f.Close() + defer func() { + cerr := f.Close() + if err == nil { + err = cerr + } + }() log.SetOutput(f) path := a.getPath() - ui, err := a.createUI() + ui, err = a.createUI() if err != nil { - return err + return } - if err := a.setNoCross(path); err != nil { - return err + if err = a.setNoCross(path); err != nil { + return } ui.SetIgnoreDirPaths(a.Flags.IgnoreDirs) if len(a.Flags.IgnoreDirPatterns) > 0 { - if err := ui.SetIgnoreDirPatterns(a.Flags.IgnoreDirPatterns); err != nil { - return err + if err = ui.SetIgnoreDirPatterns(a.Flags.IgnoreDirPatterns); err != nil { + return } } @@ -102,11 +113,12 @@ func (a *App) Run() error { a.setMaxProcs() - if err := a.runAction(ui, path); err != nil { - return err + if err = a.runAction(ui, path); err != nil { + return } - return ui.StartUILoop() + err = ui.StartUILoop() + return } func (a *App) getPath() string { @@ -136,7 +148,7 @@ func (a *App) createUI() (UI, error) { if a.Flags.OutputFile == "-" { output = os.Stdout } else { - output, err = os.OpenFile(a.Flags.OutputFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + output, err = os.OpenFile(a.Flags.OutputFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return nil, fmt.Errorf("opening output file: %w", err) } @@ -197,7 +209,7 @@ func (a *App) runAction(ui UI, path string) error { if a.Flags.InputFile == "-" { input = os.Stdin } else { - input, err = os.OpenFile(a.Flags.InputFile, os.O_RDONLY, 0644) + input, err = os.OpenFile(a.Flags.InputFile, os.O_RDONLY, 0600) if err != nil { return fmt.Errorf("opening input file: %w", err) } diff --git a/pkg/device/dev_linux.go b/pkg/device/dev_linux.go index dafcd03f6..767eed3cc 100644 --- a/pkg/device/dev_linux.go +++ b/pkg/device/dev_linux.go @@ -2,6 +2,7 @@ package device import ( "bufio" + "fmt" "io" "os" "strings" @@ -22,9 +23,18 @@ func (t LinuxDevicesInfoGetter) GetMounts() (Devices, error) { if err != nil { return nil, err } - defer file.Close() - return readMountsFile(file) + devices, err := readMountsFile(file) + if err != nil { + if cerr := file.Close(); cerr != nil { + return nil, fmt.Errorf("%w; %s", err, cerr) + } + return nil, err + } + if err := file.Close(); err != nil { + return nil, err + } + return devices, nil } // GetDevicesInfo returns result of GetMounts with usage info about mounted devices (by calling Statfs syscall) diff --git a/report/export.go b/report/export.go index f53532b28..85ad477d6 100644 --- a/report/export.go +++ b/report/export.go @@ -110,7 +110,10 @@ func (ui *UI) AnalyzePath(path string, _ *analyze.Dir) error { switch f := ui.exportOutput.(type) { case *os.File: - f.Close() + err = f.Close() + if err != nil { + return err + } } if ui.ShowProgress { diff --git a/tui/actions.go b/tui/actions.go index 417ff14b2..fbf301b86 100644 --- a/tui/actions.go +++ b/tui/actions.go @@ -262,7 +262,11 @@ func (ui *UI) showFile() *tview.TextView { file.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Rune() == 'q' || event.Key() == tcell.KeyESC { - f.Close() + err = f.Close() + if err != nil { + ui.showErr("Error closing file", err) + return event + } ui.currentDirLabel.SetText("[::b] --- " + strings.TrimPrefix(ui.currentDirPath, build.RootPathPrefix) + " ---").SetDynamicColors(true)