Fix potential resource leaks from defer calls in for loop

This moves file operations inside the `for` loop into an anonymous func,
so the `defer` calls don't wait until the end of the handler call to
actually execute.

Ref T609
pull/172/head
Matt Baer 5 years ago
parent 6860c0a3ff
commit 03eeca179e
  1. 17
      account_import.go

@ -82,11 +82,13 @@ func handleImport(app *App, u *User, w http.ResponseWriter, r *http.Request) err
filesSubmitted := len(files) filesSubmitted := len(files)
var filesImported int var filesImported int
for _, formFile := range files { for _, formFile := range files {
fname := ""
ok := func() bool {
file, err := formFile.Open() file, err := formFile.Open()
if err != nil { if err != nil {
fileErrs = append(fileErrs, fmt.Errorf("failed to open form file: %s", formFile.Filename)) fileErrs = append(fileErrs, fmt.Errorf("failed to open form file: %s", formFile.Filename))
log.Error("import textfile: open from form: %v", err) log.Error("import textfile: open from form: %v", err)
continue return false
} }
defer file.Close() defer file.Close()
@ -94,7 +96,7 @@ func handleImport(app *App, u *User, w http.ResponseWriter, r *http.Request) err
if err != nil { if err != nil {
fileErrs = append(fileErrs, fmt.Errorf("failed to create temporary file for: %s", formFile.Filename)) fileErrs = append(fileErrs, fmt.Errorf("failed to create temporary file for: %s", formFile.Filename))
log.Error("import textfile: create temp file: %v", err) log.Error("import textfile: create temp file: %v", err)
continue return false
} }
defer tempFile.Close() defer tempFile.Close()
@ -102,16 +104,23 @@ func handleImport(app *App, u *User, w http.ResponseWriter, r *http.Request) err
if err != nil { if err != nil {
fileErrs = append(fileErrs, fmt.Errorf("failed to copy file into temporary location: %s", formFile.Filename)) fileErrs = append(fileErrs, fmt.Errorf("failed to copy file into temporary location: %s", formFile.Filename))
log.Error("import textfile: copy to temp: %v", err) log.Error("import textfile: copy to temp: %v", err)
continue return false
} }
info, err := tempFile.Stat() info, err := tempFile.Stat()
if err != nil { if err != nil {
fileErrs = append(fileErrs, fmt.Errorf("failed to get file info of: %s", formFile.Filename)) fileErrs = append(fileErrs, fmt.Errorf("failed to get file info of: %s", formFile.Filename))
log.Error("import textfile: stat temp file: %v", err) log.Error("import textfile: stat temp file: %v", err)
return false
}
fname = info.Name()
return true
}()
if !ok {
continue continue
} }
post, err := wfimport.FromFile(filepath.Join(os.TempDir(), info.Name()))
post, err := wfimport.FromFile(filepath.Join(os.TempDir(), fname))
if err == wfimport.ErrEmptyFile { if err == wfimport.ErrEmptyFile {
// not a real error so don't log // not a real error so don't log
_ = addSessionFlash(app, w, r, fmt.Sprintf("%s was empty, import skipped", formFile.Filename), nil) _ = addSessionFlash(app, w, r, fmt.Sprintf("%s was empty, import skipped", formFile.Filename), nil)

Loading…
Cancel
Save