(mem MemCache, msg *Message)
| 411 | } |
| 412 | |
| 413 | func (d *Decoder) decodeSet(mem MemCache, msg *Message) error { |
| 414 | startCount := d.reader.ReadCount() |
| 415 | |
| 416 | setHeader := new(SetHeader) |
| 417 | if err := setHeader.unmarshal(d.reader); err != nil { |
| 418 | return err |
| 419 | } |
| 420 | if setHeader.Length < 4 { |
| 421 | return io.ErrUnexpectedEOF |
| 422 | } |
| 423 | |
| 424 | var tr TemplateRecord |
| 425 | var err error |
| 426 | // This check is somewhat redundant with the switch-clause below, but the retrieve() operation should not be executed inside the loop. |
| 427 | if setHeader.FlowSetID > 255 { |
| 428 | var ok bool |
| 429 | tr, ok = mem.retrieve(setHeader.FlowSetID, d.raddr) |
| 430 | if !ok { |
| 431 | err = nonfatalError(fmt.Errorf("%s unknown netflow template id# %d", |
| 432 | d.raddr.String(), |
| 433 | setHeader.FlowSetID, |
| 434 | )) |
| 435 | } |
| 436 | } |
| 437 | |
| 438 | // the next set should be greater than 4 bytes otherwise that's padding |
| 439 | for err == nil && (int(setHeader.Length)-(d.reader.ReadCount()-startCount) > 4) && d.reader.Len() > 4 { |
| 440 | if setId := setHeader.FlowSetID; setId == 0 || setId == 1 { |
| 441 | // Template record or template option record |
| 442 | tr := TemplateRecord{} |
| 443 | if setId == 0 { |
| 444 | err = tr.unmarshal(d.reader) |
| 445 | } else { |
| 446 | err = tr.unmarshalOpts(d.reader) |
| 447 | } |
| 448 | if err == nil { |
| 449 | mem.insert(tr.TemplateID, d.raddr, tr) |
| 450 | } |
| 451 | } else if setId >= 4 && setId <= 255 { |
| 452 | // Reserved set, do not read any records |
| 453 | break |
| 454 | } else { |
| 455 | // Data set |
| 456 | var data []DecodedField |
| 457 | data, err = d.decodeData(tr) |
| 458 | if err == nil { |
| 459 | msg.DataSets = append(msg.DataSets, data) |
| 460 | } |
| 461 | } |
| 462 | } |
| 463 | |
| 464 | // Skip the rest of the set in order to properly continue with the next set |
| 465 | // This is necessary if the set is padded, has a reserved set ID, or a nonfatal error occurred |
| 466 | leftoverBytes := int(setHeader.Length) - (d.reader.ReadCount() - startCount) |
| 467 | if leftoverBytes > 0 { |
| 468 | _, skipErr := d.reader.Read(int(leftoverBytes)) |
| 469 | if skipErr != nil { |
| 470 | err = skipErr |
no test coverage detected