From 2c302d976db6872115122f9ada251e6acc532813 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 17 Jun 2018 16:49:37 +0200 Subject: [PATCH] captured: plug goroutine leak from closed SSH connections --- cmd/captured/ssh.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/captured/ssh.go b/cmd/captured/ssh.go index e9d4599..11ca384 100644 --- a/cmd/captured/ssh.go +++ b/cmd/captured/ssh.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "io/ioutil" "log" @@ -56,6 +57,9 @@ func (s *session) request(req *ssh.Request) error { } log.Printf("exec, wantReply %v, payload %q", req.WantReply, string(req.Payload[4:])) + ctx, canc := context.WithCancel(context.Background()) + defer canc() + pcapw := pcapgo.NewWriter(s.channel) if err := pcapw.WriteFileHeader(1600, layers.LinkTypeEthernet); err != nil { return err @@ -76,8 +80,13 @@ func (s *session) request(req *ssh.Request) error { pkgsrc := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) go func() { + defer handle.Close() for packet := range pkgsrc.Packets() { - packets <- packet + select { + case packets <- packet: + case <-ctx.Done(): + return + } } }() } @@ -85,7 +94,6 @@ func (s *session) request(req *ssh.Request) error { req.Reply(true, nil) for packet := range packets { - log.Printf("packet: %+v", packet) if err := pcapw.WritePacket(packet.Metadata().CaptureInfo, packet.Data()); err != nil { return fmt.Errorf("pcap.WritePacket(): %v", err) }