ssh: handle bad servers better.

This change prevents bad servers from crashing a client by sending an
invalid channel ID. It also makes the client disconnect in more cases
of invalid messages from a server and cleans up the client channels
in the event of a disconnect.

R=dave
CC=golang-dev
https://golang.org/cl/6099050
This commit is contained in:
Adam Langley
2012-04-24 13:46:22 -04:00
parent 58afe880f1
commit bcdd6a2fd3
2 changed files with 75 additions and 17 deletions
+25
View File
@@ -275,6 +275,20 @@ func TestExitWithoutStatusOrSignal(t *testing.T) {
}
}
func TestInvalidServerMessage(t *testing.T) {
conn := dial(sendInvalidRecord, t)
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
t.Fatalf("Unable to request new session: %s", err)
}
// Make sure that we closed all the clientChans when the connection
// failed.
session.wait()
defer session.Close()
}
type exitStatusMsg struct {
PeersId uint32
Request string
@@ -373,3 +387,14 @@ func sendSignal(signal string, ch *channel) {
}
ch.serverConn.writePacket(marshal(msgChannelRequest, sig))
}
func sendInvalidRecord(ch *channel) {
defer ch.Close()
packet := make([]byte, 1+4+4+1)
packet[0] = msgChannelData
marshalUint32(packet[1:], 29348723 /* invalid channel id */)
marshalUint32(packet[5:], 1)
packet[9] = 42
ch.serverConn.writePacket(packet)
}