From 36d74d6fed0f383a535f280944e1e2dc24844b67 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Fri, 18 May 2012 09:11:31 +1000 Subject: [PATCH] go.crypto/ssh: fix panic unmarshalling channelOpenFailureMsg I introduced this problem in change set 33 when I redefined RejectionReason from a uint32 to an int. I have added a test to verify the message can be marshaled correctly. This was a bit hard to track down as the recover in clientConn mainLoop would catch the panic and shutdown the connection. We probably shouldn't be using panic inside marshal/unmarshal, at least not without a way to let the user know why the recover logic tripped. R=agl, kardianos, gustav.paul CC=golang-dev https://golang.org/cl/6210063 --- ssh/channel.go | 2 +- ssh/messages_test.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ssh/channel.go b/ssh/channel.go index 6d82bd4..40f0aa0 100644 --- a/ssh/channel.go +++ b/ssh/channel.go @@ -61,7 +61,7 @@ func (c ChannelRequest) Error() string { // RejectionReason is an enumeration used when rejecting channel creation // requests. See RFC 4254, section 5.1. -type RejectionReason int +type RejectionReason uint32 const ( Prohibited RejectionReason = iota + 1 diff --git a/ssh/messages_test.go b/ssh/messages_test.go index 24a8bd9..fb94404 100644 --- a/ssh/messages_test.go +++ b/ssh/messages_test.go @@ -40,6 +40,7 @@ var messageTypes = []interface{}{ &userAuthRequestMsg{}, &channelOpenMsg{}, &channelOpenConfirmMsg{}, + &channelOpenFailureMsg{}, &channelRequestMsg{}, &channelRequestSuccessMsg{}, } @@ -124,6 +125,13 @@ func (*kexDHInitMsg) Generate(rand *rand.Rand, size int) reflect.Value { return reflect.ValueOf(dhi) } +// TODO(dfc) maybe this can be removed in the future if testing/quick can handle +// derived basic types. +func (RejectionReason) Generate(rand *rand.Rand, size int) reflect.Value { + m := RejectionReason(Prohibited) + return reflect.ValueOf(m) +} + var ( _kexInitMsg = new(kexInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface() _kexDHInitMsg = new(kexDHInitMsg).Generate(rand.New(rand.NewSource(0)), 10).Elem().Interface()