captured: plug goroutine leak from closed SSH connections

This commit is contained in:
Michael Stapelberg 2018-06-17 16:49:37 +02:00
parent bb563e0798
commit 2c302d976d

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "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:])) 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) pcapw := pcapgo.NewWriter(s.channel)
if err := pcapw.WriteFileHeader(1600, layers.LinkTypeEthernet); err != nil { if err := pcapw.WriteFileHeader(1600, layers.LinkTypeEthernet); err != nil {
return err return err
@ -76,8 +80,13 @@ func (s *session) request(req *ssh.Request) error {
pkgsrc := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) pkgsrc := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet)
go func() { go func() {
defer handle.Close()
for packet := range pkgsrc.Packets() { 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) req.Reply(true, nil)
for packet := range packets { for packet := range packets {
log.Printf("packet: %+v", packet)
if err := pcapw.WritePacket(packet.Metadata().CaptureInfo, packet.Data()); err != nil { if err := pcapw.WritePacket(packet.Metadata().CaptureInfo, packet.Data()); err != nil {
return fmt.Errorf("pcap.WritePacket(): %v", err) return fmt.Errorf("pcap.WritePacket(): %v", err)
} }