From 98dc8115365372f5b788f35f55c54067c58adc69 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Fri, 1 May 2015 17:13:03 +0200 Subject: [PATCH] Add nil-receiver awareness to all Reader/Writer --- backend/generic.go | 4 ++++ backend/sftp/sftp.go | 4 ++++ backend/writer.go | 4 ++++ crypto/reader.go | 7 ++++--- crypto/writer.go | 4 ++++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/backend/generic.go b/backend/generic.go index 0720809bd..0244cdab1 100644 --- a/backend/generic.go +++ b/backend/generic.go @@ -115,6 +115,10 @@ func (l *blobReader) Read(p []byte) (int, error) { } func (l *blobReader) Close() error { + if l == nil { + return nil + } + if !l.closed { err := l.f.Close() l.closed = true diff --git a/backend/sftp/sftp.go b/backend/sftp/sftp.go index aa0fdd2af..09dad6242 100644 --- a/backend/sftp/sftp.go +++ b/backend/sftp/sftp.go @@ -554,6 +554,10 @@ func (r *SFTP) ID() string { // Close closes the sftp connection and terminates the underlying command. func (s *SFTP) Close() error { + if s == nil { + return nil + } + s.c.Close() // TODO: add timeout after which the process is killed return s.cmd.Wait() diff --git a/backend/writer.go b/backend/writer.go index 17e7d0653..ae2c5bfd9 100644 --- a/backend/writer.go +++ b/backend/writer.go @@ -24,6 +24,10 @@ func NewHashAppendWriter(w io.Writer, h hash.Hash) *HashAppendWriter { } func (h *HashAppendWriter) Close() error { + if h == nil { + return nil + } + if !h.closed { h.closed = true diff --git a/crypto/reader.go b/crypto/reader.go index fe27f5344..20c451cf3 100644 --- a/crypto/reader.go +++ b/crypto/reader.go @@ -30,7 +30,7 @@ func (d *decryptReader) free() { } func (d *decryptReader) Close() error { - if d.buf == nil { + if d == nil || d.buf == nil { return nil } @@ -72,14 +72,15 @@ func DecryptFrom(ks *Key, rd io.Reader) (io.ReadCloser, error) { buf := bytes.NewBuffer(getBuffer()[:0]) _, err := buf.ReadFrom(rd) if err != nil { - return nil, err + return (*decryptReader)(nil), err } ciphertext := buf.Bytes() ciphertext, err = Decrypt(ks, ciphertext, ciphertext) if err != nil { - return nil, err + freeBuffer(ciphertext) + return (*decryptReader)(nil), err } return &decryptReader{buf: ciphertext, rd: bytes.NewReader(ciphertext)}, nil diff --git a/crypto/writer.go b/crypto/writer.go index 3de2df69c..63a09438e 100644 --- a/crypto/writer.go +++ b/crypto/writer.go @@ -17,6 +17,10 @@ type encryptWriter struct { } func (e *encryptWriter) Close() error { + if e == nil { + return nil + } + if e.closed { return errors.New("Close() called on already closed writer") }