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:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user