aregm / nff-go

NFF-Go -Network Function Framework for GO (former YANFF)
BSD 3-Clause "New" or "Revised" License
1.38k stars 154 forks source link

slice bounds out of range [78:60] when use GetPacketPayload() #683

Closed cang233 closed 4 years ago

cang233 commented 4 years ago

code:

func globalHandler(ps []*packet.Packet, mask *[32]bool, context flow.UserContext) {
    var i uint64 = 0
    for i = 0; i < 32; i++ {
        if (*mask)[i] {
            ps[i].ParseL3()
            //ipv4
            tcp4, udp4, _ := ps[i].ParseAllKnownL4ForIPv4()
            if tcp4 != nil {
                payload,_ := ps[i].GetPacketPayload()
                flows.Ipv4TCPPktChan <- &flows.Ipv4TCPPktInfo{
                    EtherHdr:    ps[i].Ether,
                    Ipv4Hdr:     ps[i].GetIPv4NoCheck(),
                    TCPHdr:      tcp4,
                    TotalLen:    ps[i].GetPacketLen(),
                    ArrivalTime: ps[i].GetPacketTimestamp(),
                    Payload: payload,
                }
                continue
            } else if udp4 != nil {
                continue
            }

error:

panic: runtime error: slice bounds out of range [78:60]
goroutine 99 [running, locked to thread]:
github.com/intel-go/nff-go/packet.(*Packet).GetPacketPayload(0x174d8b140, 0x174d8b1e2, 0x0, 0x0, 0x1)
    /home/pvs1/gopath/pkg/mod/github.com/intel-go/nff-go@v0.9.1/packet/packet.go:750 +0xf1
main.globalHandler(0xc0005de000, 0x20, 0x20, 0xc0005ae508, 0x0, 0x0)
    /home/pvs1/gopath/src/flowparser/main.go:41 +0x113
github.com/intel-go/nff-go/flow.vHandle(0xc0005de000, 0x20, 0x20, 0xc0005ae508, 0xc000598120, 0xc0005d4000, 0x0, 0x0)
    /home/pvs1/gopath/pkg/mod/github.com/intel-go/nff-go@v0.9.1/flow/flow.go:1841 +0x66
github.com/intel-go/nff-go/flow.segmentProcess(0x9edd40, 0xc0004dad80, 0xc0000261e0, 0x11, 0x11, 0xc0005bc060, 0xc0005bc0c0, 0xc0005da280, 0xc0004b2280, 0x2, ...)
    /home/pvs1/gopath/pkg/mod/github.com/intel-go/nff-go@v0.9.1/flow/flow.go:1492 +0x82d
github.com/intel-go/nff-go/flow.(*instance).startNewClone.func1(0xc0004ea600, 0x2, 0xc000485380)
    /home/pvs1/gopath/pkg/mod/github.com/intel-go/nff-go@v0.9.1/flow/scheduler.go:289 +0x245
created by github.com/intel-go/nff-go/flow.(*instance).startNewClone
    /home/pvs1/gopath/pkg/mod/github.com/intel-go/nff-go@v0.9.1/flow/scheduler.go:283 +0x2b2
aregm commented 4 years ago

Is this repeatable? In general, the right way to get payload is:

payload, ok := ps[i].GetPacketPayload()
    if !ok { ...

Can you do some debugging to find out what the slice indexes are when the panic occurs? Thanks.

cang233 commented 4 years ago

No,it occures just serveral time...Now I change my code and the error has gone...