From ff7f7c7ea6169d651d8376ab64d754fbe82aab8a Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Tue, 14 Oct 2025 20:41:42 -0700 Subject: Avoid an extra copy in ASCII decode Unfortunately ASCII encode still has to copy, but that one's more complicated. --- internal/sym/dec.go | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) (limited to 'internal') diff --git a/internal/sym/dec.go b/internal/sym/dec.go index 45c7409..93130a4 100644 --- a/internal/sym/dec.go +++ b/internal/sym/dec.go @@ -2,7 +2,6 @@ package sym import ( "bufio" - "bytes" "encoding/base64" "encoding/binary" "errors" @@ -13,27 +12,6 @@ import ( "strings" ) -type lineReader struct { - r *bufio.Reader - line []byte -} - -func (r *lineReader) Read(buf []byte) (int, error) { - for len(r.line) == 0 { - line, err := r.r.ReadBytes('\n') - if len(line) == 0 { - return 0, err - } - if bytes.HasPrefix(line, []byte("-")) { - continue - } - r.line = bytes.TrimSuffix(line, []byte("\n")) - } - n := copy(buf, r.line) - r.line = r.line[n:] - return n, nil -} - func decryptBinary(w io.Writer, r io.Reader, password string) error { fileFormat := make([]byte, 4) if _, err := io.ReadFull(r, fileFormat); err != nil { @@ -68,7 +46,16 @@ func decrypt(w io.Writer, r io.Reader, password string) error { if b[0] != '-' { return errors.New("invalid input") } - return decryptBinary(w, base64.NewDecoder(base64.StdEncoding, &lineReader{r: bufReader}), password) + for { + _, err := bufReader.ReadBytes('\n') + if err != nil { + return err + } + if b, err := bufReader.Peek(1); err != nil || b[0] != '-' { + break + } + } + return decryptBinary(w, base64.NewDecoder(base64.StdEncoding, bufReader), password) } type decryptFlags struct { -- cgit v1.3.1