crypto/ssh: fix several logic errors.
These are the obvious mistakes from my read through. I'll save the more cosmetic changes for a later CL. R=dave, kardianos CC=golang-dev https://golang.org/cl/6049050
This commit is contained in:
+18
-15
@@ -171,7 +171,7 @@ func (c *channel) handleData(data []byte) {
|
|||||||
c.myWindow -= uint32(len(data))
|
c.myWindow -= uint32(len(data))
|
||||||
for i := 0; i < 2; i++ {
|
for i := 0; i < 2; i++ {
|
||||||
tail := c.head + c.length
|
tail := c.head + c.length
|
||||||
if tail > len(c.pendingData) {
|
if tail >= len(c.pendingData) {
|
||||||
tail -= len(c.pendingData)
|
tail -= len(c.pendingData)
|
||||||
}
|
}
|
||||||
n := copy(c.pendingData[tail:], data)
|
n := copy(c.pendingData[tail:], data)
|
||||||
@@ -236,16 +236,6 @@ func (c *channel) Read(data []byte) (n int, err error) {
|
|||||||
return 0, c.err
|
return 0, c.err
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.myWindow <= uint32(len(c.pendingData))/2 {
|
|
||||||
packet := marshal(msgChannelWindowAdjust, windowAdjustMsg{
|
|
||||||
PeersId: c.theirId,
|
|
||||||
AdditionalBytes: uint32(len(c.pendingData)) - c.myWindow,
|
|
||||||
})
|
|
||||||
if err := c.serverConn.writePacket(packet); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
for {
|
||||||
if c.theySentEOF || c.theyClosed || c.dead {
|
if c.theySentEOF || c.theyClosed || c.dead {
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
@@ -265,16 +255,29 @@ func (c *channel) Read(data []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.length > 0 {
|
if c.length > 0 {
|
||||||
tail := c.head + c.length
|
tail := min(c.head + c.length, len(c.pendingData))
|
||||||
if tail > len(c.pendingData) {
|
|
||||||
tail -= len(c.pendingData)
|
|
||||||
}
|
|
||||||
n = copy(data, c.pendingData[c.head:tail])
|
n = copy(data, c.pendingData[c.head:tail])
|
||||||
c.head += n
|
c.head += n
|
||||||
c.length -= n
|
c.length -= n
|
||||||
if c.head == len(c.pendingData) {
|
if c.head == len(c.pendingData) {
|
||||||
c.head = 0
|
c.head = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
windowAdjustment := uint32(len(c.pendingData)-c.length) - c.myWindow
|
||||||
|
if windowAdjustment >= uint32(len(c.pendingData)/2) {
|
||||||
|
packet := marshal(msgChannelWindowAdjust, windowAdjustMsg{
|
||||||
|
PeersId: c.theirId,
|
||||||
|
AdditionalBytes: windowAdjustment,
|
||||||
|
})
|
||||||
|
c.serverConn.lock.Lock()
|
||||||
|
err = c.serverConn.writePacket(packet)
|
||||||
|
c.serverConn.lock.Unlock()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.myWindow += windowAdjustment
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user