From 4fe503d14286e380130c7e8e6e5909d2a3428195 Mon Sep 17 00:00:00 2001 From: inliquid Date: Thu, 26 May 2022 14:37:23 +0300 Subject: [PATCH] - Stderr should be read after closing Stdin - Fix reading of Stderr contents - Remove redundand calls to `Close` --- msg.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/msg.go b/msg.go index 7367ed6..6e33970 100644 --- a/msg.go +++ b/msg.go @@ -514,17 +514,11 @@ func (m *Msg) WriteToSendmailWithContext(ctx context.Context, sp string, a ...st if err != nil { return fmt.Errorf("failed to set STDERR pipe: %w", err) } - defer func() { - _ = se.Close() - }() si, err := ec.StdinPipe() if err != nil { return fmt.Errorf("failed to set STDIN pipe: %w", err) } - defer func() { - _ = si.Close() - }() // Start the execution and write to STDIN if err := ec.Start(); err != nil { @@ -537,20 +531,20 @@ func (m *Msg) WriteToSendmailWithContext(ctx context.Context, sp string, a ...st } } - // Read the stderr pipe for possible errors - var serr []byte - en, err := se.Read(serr) - if err != nil { - return fmt.Errorf("failed to read STDERR pipe: %w", err) - } - if en > 0 { - return fmt.Errorf("sendmail command failed: %s", serr) - } - // Close STDIN and wait for completion or cancellation of the sendmail executable if err := si.Close(); err != nil { return fmt.Errorf("failed to close STDIN pipe: %w", err) } + + // Read the stderr pipe for possible errors + serr, err := io.ReadAll(se) + if err != nil { + return fmt.Errorf("failed to read STDERR pipe: %w", err) + } + if len(serr) > 0 { + return fmt.Errorf("sendmail command failed: %s", string(serr)) + } + if err := ec.Wait(); err != nil { return fmt.Errorf("sendmail command execution failed: %w", err) }