Skip to content

Commit

Permalink
Merge pull request #391 from greatroar/disconnect-no-eof
Browse files Browse the repository at this point in the history
Detect remote disconnect in File methods
  • Loading branch information
drakkan authored Nov 7, 2020
2 parents 796f65a + 06d60c4 commit 4bca1e2
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 5 deletions.
41 changes: 37 additions & 4 deletions client_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1872,7 +1872,8 @@ func TestServerRoughDisconnect(t *testing.T) {
cmd.Process.Kill()
}()

io.Copy(ioutil.Discard, f)
_, err = io.Copy(ioutil.Discard, f)
assert.Error(t, err)
}

// sftp/issue/181, abrupt server hangup would result in client hangs.
Expand Down Expand Up @@ -1930,7 +1931,8 @@ func TestServerRoughDisconnect3(t *testing.T) {
cmd.Process.Kill()
}()

io.Copy(rf, lf)
_, err = io.Copy(rf, lf)
assert.Error(t, err)
}

// sftp/issue/234 - also affected Write
Expand Down Expand Up @@ -1962,19 +1964,50 @@ func TestServerRoughDisconnect4(t *testing.T) {
for {
_, err = rf.Write(b)
if err != nil {
assert.NotEqual(t, io.EOF, err)
break
}
}

io.Copy(rf, lf)
_, err = io.Copy(rf, lf)
assert.Error(t, err)
}

// sftp/issue/390 - server disconnect should not cause io.EOF or
// io.ErrUnexpectedEOF in sftp.File.Read, because those confuse io.ReadFull.
func TestServerRoughDisconnectEOF(t *testing.T) {
skipIfWindows(t)
if *testServerImpl {
t.Skipf("skipping with -testserver")
}
sftp, cmd := testClient(t, READONLY, NODELAY)
defer cmd.Wait()
defer sftp.Close()

f, err := sftp.Open("/dev/null")
if err != nil {
t.Fatal(err)
}
defer f.Close()
go func() {
time.Sleep(100 * time.Millisecond)
cmd.Process.Kill()
}()

_, err = io.ReadFull(f, make([]byte, 10))
assert.Error(t, err)
assert.NotEqual(t, io.ErrUnexpectedEOF, err)
}

// sftp/issue/26 writing to a read only file caused client to loop.
func TestClientWriteToROFile(t *testing.T) {
skipIfWindows(t)
sftp, cmd := testClient(t, READWRITE, NODELAY)
defer cmd.Wait()
defer sftp.Close()
defer func() {
err := sftp.Close()
assert.NoError(t, err)
}()

f, err := sftp.Open("/dev/zero")
if err != nil {
Expand Down
3 changes: 2 additions & 1 deletion conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,9 @@ func (c *clientConn) broadcastErr(err error) {
listeners = append(listeners, ch)
}
c.Unlock()
bcastRes := result{err: errors.New("unexpected server disconnect")}
for _, ch := range listeners {
ch <- result{err: err}
ch <- bcastRes
}
c.err = err
close(c.closed)
Expand Down

0 comments on commit 4bca1e2

Please sign in to comment.