diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-13 18:03:10 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-10-13 18:03:10 -0700 |
| commit | 10d2a1b2acb603bcc59b45150312a26db2f0d229 (patch) | |
| tree | 35d7189485e2d76d51aff4acc8da1f1206d29e45 /internal | |
| parent | Add file header and metadata (diff) | |
| download | sym-10d2a1b2acb603bcc59b45150312a26db2f0d229.tar.zst | |
Fix reader buffering logic
Now it doesn't do a short read between each long read.
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/sym/oae.go | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/internal/sym/oae.go b/internal/sym/oae.go index 3b17957..8fbbeea 100644 --- a/internal/sym/oae.go +++ b/internal/sym/oae.go @@ -186,7 +186,7 @@ type decryptingReader struct { func (e *encryptionMetadata) newDecryptingReader(r io.Reader, password string, passwordMetadata *hashMetadata) *decryptingReader { return &decryptingReader{ - r: bufio.NewReaderSize(r, 1), + r: bufio.NewReaderSize(r, 0), // we only need .UnreadByte decrypter: segmentEncrypter{ hashMetadata: *passwordMetadata, encryptionMetadata: *e, @@ -209,21 +209,25 @@ func (r *decryptingReader) initialize() error { if err := r.decrypter.initialize(header); err != nil { return err } - r.buf = *bytes.NewBuffer(make([]byte, 0, r.decrypter.encryptionMetadata.SegmentSize)) + r.buf = *bytes.NewBuffer(make([]byte, 0, r.decrypter.encryptionMetadata.SegmentSize+1)) r.initialized = true return nil } func (r *decryptingReader) fillBuf() error { r.buf.Reset() - buf := r.buf.AvailableBuffer()[:r.decrypter.encryptionMetadata.SegmentSize] + // Read 1 extra byte to make sure if we're at EOF. + buf := r.buf.AvailableBuffer()[:r.decrypter.encryptionMetadata.SegmentSize+1] n, err := io.ReadFull(r.r, buf) - if n == 0 { + if err != nil && err != io.ErrUnexpectedEOF { return err } buf = buf[:n] - _, readErr := r.r.Peek(1) - buf, err = r.decrypter.decrypt(buf[:0], buf, readErr == io.EOF) + if len(buf) == int(r.decrypter.encryptionMetadata.SegmentSize)+1 { + r.r.UnreadByte() + buf = buf[:r.decrypter.encryptionMetadata.SegmentSize] + } + buf, err = r.decrypter.decrypt(buf[:0], buf, err == io.ErrUnexpectedEOF) if err != nil { return err } |
