captured: plug goroutine leak from closed SSH connections
This commit is contained in:
parent
bb563e0798
commit
2c302d976d
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user