fix: crash in parser with nil decode context
Some checks failed
Build RPM Package / Build RPM Packages (CentOS 7, Rocky 8/9/10) (push) Has been cancelled

- Use gopacket.NewPacket with LinkTypeIPv4/IPv6 instead of DecodeFromBytes
- Fixes panic: runtime error: invalid memory address or nil pointer dereference
- Properly handles raw IP packets after SLL header stripping

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
toto
2026-03-04 11:24:09 +01:00
parent 49b8bfbf60
commit cc1fa5dc69

View File

@ -163,31 +163,19 @@ func (p *ParserImpl) Process(pkt api.RawPacket) (*api.TLSClientHello, error) {
}
tcpLayer = packet.Layer(layers.LayerTypeTCP)
// If no IP/TCP layer found with Ethernet, try direct IP decoding
// This handles raw IP data (e.g., after stripping SLL header)
// If no IP/TCP layer found with Ethernet, try parsing as raw IP
// This handles stripped SLL data or other non-Ethernet formats
if ipLayer == nil || tcpLayer == nil {
// Try IPv4
ipv4 := &layers.IPv4{}
if err := ipv4.DecodeFromBytes(data, nil); err == nil {
ipLayer = ipv4
// Try to decode TCP from IPv4 payload
tcp := &layers.TCP{}
if err := tcp.DecodeFromBytes(ipv4.Payload, nil); err == nil {
tcpLayer = tcp
}
}
}
// Try IPv6 if IPv4 didn't work
// Try parsing as raw IPv4 packet
rawPacket := gopacket.NewPacket(data, layers.LinkTypeIPv4, gopacket.Default)
ipLayer = rawPacket.Layer(layers.LayerTypeIPv4)
if ipLayer == nil {
ipv6 := &layers.IPv6{}
if err := ipv6.DecodeFromBytes(data, nil); err == nil {
ipLayer = ipv6
// Try to decode TCP from IPv6 payload
tcp := &layers.TCP{}
if err := tcp.DecodeFromBytes(ipv6.Payload, nil); err == nil {
tcpLayer = tcp
// Try parsing as raw IPv6 packet
rawPacket = gopacket.NewPacket(data, layers.LinkTypeIPv6, gopacket.Default)
ipLayer = rawPacket.Layer(layers.LayerTypeIPv6)
}
if ipLayer != nil {
tcpLayer = rawPacket.Layer(layers.LayerTypeTCP)
}
}