From a0054f9cf739819b643892f52d2a9f6346201f38 Mon Sep 17 00:00:00 2001 From: iFrozenPhoenix <36128722+iFrozenPhoenix@users.noreply.github.com> Date: Sun, 3 Sep 2023 13:16:53 +0000 Subject: [PATCH] fix: fixes Using the same file as input and output produces a corrupt result without notice. #491 --- cmd/age/age.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/cmd/age/age.go b/cmd/age/age.go index f81d3bba..db06d925 100644 --- a/cmd/age/age.go +++ b/cmd/age/age.go @@ -246,13 +246,28 @@ func main() { } } if name := outFlag; name != "" && name != "-" { - f := newLazyOpener(name) - defer func() { - if err := f.Close(); err != nil { - errorf("failed to close output file %q: %v", name, err) - } - }() - out = f + if name != flag.Arg(0) { + f := newLazyOpener(name) + defer func() { + if err := f.Close(); err != nil { + errorf("failed to close output file %q: %v", name, err) + } + }() + out = f + } else { + buf := &bytes.Buffer{} + defer func() { + f, err := os.Create(name) + if err != nil { + errorf("failed to create output file %q: %w", name, err) + } + io.Copy(f, buf) + if err := f.Close(); err != nil { + errorf("failed to close output file %q: %v", name, err) + } + }() + out = buf + } } else if term.IsTerminal(int(os.Stdout.Fd())) { if name != "-" { if decryptFlag {