Unverified Commit 29a0d6e9 authored by Steven Allen's avatar Steven Allen Committed by GitHub

Merge pull request #25 from libp2p/fix/recv-deadlock

fix: unlock recvLock in all cases.
parents 9a36404e dae8a2b1
...@@ -1208,6 +1208,34 @@ func TestSession_sendMsg_Timeout(t *testing.T) { ...@@ -1208,6 +1208,34 @@ func TestSession_sendMsg_Timeout(t *testing.T) {
} }
} }
func TestWindowOverflow(t *testing.T) {
// Ensures:
//
// 1. We don't accept a message that's too big.
// 2. We unlock after resetting the stream.
for i := uint32(1); i < 100; i += 2 {
func() {
client, server := testClientServerConfig(testConfNoKeepAlive())
defer client.Close()
defer server.Close()
hdr1 := encode(typeData, flagSYN, i, 0)
_ = client.sendMsg(hdr1, nil, nil)
s, err := server.AcceptStream()
if err != nil {
t.Fatal(err)
}
msg := make([]byte, client.config.MaxStreamWindowSize*2)
hdr2 := encode(typeData, 0, i, uint32(len(msg)))
_ = client.sendMsg(hdr2, msg, nil)
_, err = ioutil.ReadAll(s)
if err == nil {
t.Fatal("expected to read no data")
}
}()
}
}
func TestSession_ConnectionWriteTimeout(t *testing.T) { func TestSession_ConnectionWriteTimeout(t *testing.T) {
client, server := testClientServerConfig(testConfNoKeepAlive()) client, server := testClientServerConfig(testConfNoKeepAlive())
defer client.Close() defer client.Close()
......
...@@ -413,14 +413,15 @@ func (s *Stream) readData(hdr header, flags uint16, conn io.Reader) error { ...@@ -413,14 +413,15 @@ func (s *Stream) readData(hdr header, flags uint16, conn io.Reader) error {
s.recvLock.Lock() s.recvLock.Lock()
if length > s.recvWindow { if length > s.recvWindow {
s.recvLock.Unlock()
s.session.logger.Printf("[ERR] yamux: receive window exceeded (stream: %d, remain: %d, recv: %d)", s.id, s.recvWindow, length) s.session.logger.Printf("[ERR] yamux: receive window exceeded (stream: %d, remain: %d, recv: %d)", s.id, s.recvWindow, length)
return ErrRecvWindowExceeded return ErrRecvWindowExceeded
} }
s.recvBuf.Grow(int(length)) s.recvBuf.Grow(int(length))
if _, err := io.Copy(&s.recvBuf, conn); err != nil { if _, err := io.Copy(&s.recvBuf, conn); err != nil {
s.session.logger.Printf("[ERR] yamux: Failed to read stream data: %v", err)
s.recvLock.Unlock() s.recvLock.Unlock()
s.session.logger.Printf("[ERR] yamux: Failed to read stream data: %v", err)
return err return err
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment