From 4c5a0d663ee2c5454271ab9144ee56e0a23d3798 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Mon, 9 Nov 2020 21:01:56 +0100 Subject: [PATCH] sftpd: return the error Operation Unsupported for unexpected reads a cloud based file cannot be opened for read and write at the same time. Return a proper error if a client try to do this. It can happen only for SFTP --- sftpd/internal_test.go | 7 +++++++ sftpd/transfer.go | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/sftpd/internal_test.go b/sftpd/internal_test.go index 33b64895..a167d8fd 100644 --- a/sftpd/internal_test.go +++ b/sftpd/internal_test.go @@ -1680,6 +1680,13 @@ func TestTransferFailingReader(t *testing.T) { err = tr.Close() assert.NoError(t, err) + tr = newTransfer(baseTransfer, nil, nil, errRead) + _, err = tr.ReadAt(buf, 0) + assert.EqualError(t, err, errRead.Error()) + + err = tr.Close() + assert.NoError(t, err) + err = os.Remove(fsPath) assert.NoError(t, err) assert.Len(t, connection.GetTransfers(), 0) diff --git a/sftpd/transfer.go b/sftpd/transfer.go index 6d200036..49c66941 100644 --- a/sftpd/transfer.go +++ b/sftpd/transfer.go @@ -32,6 +32,9 @@ func (r *failingReader) ReadAt(p []byte, off int64) (n int, err error) { } func (r *failingReader) Close() error { + if r.innerReader == nil { + return nil + } return r.innerReader.Close() } @@ -70,6 +73,12 @@ func newTransfer(baseTransfer *common.BaseTransfer, pipeWriter *vfs.PipeWriter, } } } + if baseTransfer.File == nil && errForRead != nil && pipeReader == nil { + reader = &failingReader{ + innerReader: nil, + errRead: errForRead, + } + } return &transfer{ BaseTransfer: baseTransfer, writerAt: writer,