scp: check for write errors

exits as soon as there is a write error instead of get the same error when
the transfer is closed
This commit is contained in:
Nicola Murino 2020-02-19 11:26:40 +01:00
parent ae8ed75ae5
commit 62b20cd884
2 changed files with 18 additions and 2 deletions

View file

@ -1534,7 +1534,18 @@ func TestSCPUploadFiledata(t *testing.T) {
addTransfer(&transfer)
err = scpCommand.getUploadFileData(0, &transfer)
if err != errTransferClosed {
t.Errorf("upload must fail, the transfer is already closed")
t.Errorf("upload must fail, the transfer is already closed, err: %v", err)
}
mockSSHChannel = MockChannel{
Buffer: bytes.NewBuffer(buf),
StdErrBuffer: bytes.NewBuffer(stdErrBuf),
ReadError: nil,
WriteError: nil,
}
addTransfer(&transfer)
err = scpCommand.getUploadFileData(2, &transfer)
if !errors.Is(err, os.ErrClosed) {
t.Errorf("the file is closed and writes must fail, err: %v", err)
}
err = os.Remove(testfile)
if err != nil {

View file

@ -158,7 +158,12 @@ func (c *scpCommand) getUploadFileData(sizeToRead int64, transfer *Transfer) err
transfer.Close()
return err
}
transfer.WriteAt(buf[:n], sizeToRead-remaining)
_, err = transfer.WriteAt(buf[:n], sizeToRead-remaining)
if err != nil {
c.sendErrorMessage(err.Error())
transfer.Close()
return err
}
remaining -= int64(n)
if remaining <= 0 {
break