fix a panic in stream with large window updates

fixes #143
This commit is contained in:
Lucas Clemente
2016-05-25 13:12:06 +02:00
parent 9e0d211f5e
commit 17865dbba7
2 changed files with 12 additions and 2 deletions

View File

@@ -200,7 +200,7 @@ func (s *stream) Write(p []byte) (int, error) {
return 0, s.err
}
dataLen := utils.Min(len(p), int(remainingBytesInWindow))
dataLen := utils.MinByteCount(protocol.ByteCount(len(p)), remainingBytesInWindow)
data := make([]byte, dataLen)
copy(data, p)
err := s.session.queueStreamFrame(&frames.StreamFrame{
@@ -213,7 +213,7 @@ func (s *stream) Write(p []byte) (int, error) {
return 0, err
}
dataWritten += dataLen
dataWritten += int(dataLen) // We cannot have written more than the int range
s.flowController.AddBytesSent(protocol.ByteCount(dataLen))
if s.contributesToConnectionFlowControl {
s.connectionFlowController.AddBytesSent(protocol.ByteCount(dataLen))

View File

@@ -464,6 +464,16 @@ var _ = Describe("Stream", func() {
Expect(b).To(BeTrue())
Expect(err).To(MatchError(testErr))
})
It("works with large flow control windows", func() {
// This paniced before due to a wrong cast,
// see https://github.com/lucas-clemente/quic-go/issues/143
str.contributesToConnectionFlowControl = false
updated := str.UpdateSendFlowControlWindow(protocol.ByteCount(1) << 63)
Expect(updated).To(BeTrue())
_, err := str.Write([]byte("foobar"))
Expect(err).NotTo(HaveOccurred())
})
})
})