commit e6908ad17804237bb7f0669edc99e86339a18d84
parent 48bf5f705fadc940d6218ec5051f86d002541015
Author: Oliver Lowe <o@olowe.co>
Date: Fri, 9 Aug 2024 20:33:55 +1000
pcap: support only current savefile version
Reduces the stuff our package exposes. As a bonus we actually return
an error if somehow we try to decode a file we may not be able to
safely such as older, newer or invalid versions.
Diffstat:
2 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/pcap/pcap.go b/pcap/pcap.go
@@ -17,13 +17,13 @@ const (
magicBigEndian uint32 = 0xd4c3b2a1
)
+var version = [2]uint16{2, 4}
+
type GlobalHeader struct {
- VersionMajor uint16
- VersionMinor uint16
- _ int32 // leftover from old pcap versions
- _ int32 // leftover from old pcap versions
- SnapLen uint32
- Network uint32
+ _ int32 // leftover from old pcap versions
+ _ int32 // leftover from old pcap versions
+ SnapLen uint32
+ Network uint32
}
type Header struct {
@@ -57,9 +57,17 @@ func decode(reader io.Reader) (*File, error) {
return nil, fmt.Errorf("unknown magic number %#x", magic)
}
+ var v [2]uint16
+ if err := binary.Read(reader, binary.LittleEndian, &v); err != nil {
+ return nil, fmt.Errorf("read pcap version: %w", err)
+ }
+ if v != version {
+ return nil, fmt.Errorf("unsupported version %d.%d", v[0], v[1])
+ }
+
var gheader GlobalHeader
if err := binary.Read(reader, binary.LittleEndian, &gheader); err != nil {
- return nil, fmt.Errorf("read global header: %w", err)
+ return nil, fmt.Errorf("read pcap version: %w", err)
}
var packets []Packet
@@ -94,8 +102,10 @@ func decode(reader io.Reader) (*File, error) {
}
func encode(file *File) ([]byte, error) {
- b := make([]byte, 4)
+ b := make([]byte, 4+4) // magic + version
binary.NativeEndian.PutUint32(b, magicLittleEndian)
+ binary.NativeEndian.PutUint16(b[4:6], version[0])
+ binary.NativeEndian.PutUint16(b[6:8], version[1])
buf := bytes.NewBuffer(b)
if err := binary.Write(buf, binary.LittleEndian, &file.Header); err != nil {
return nil, fmt.Errorf("global header: %v", err)
diff --git a/pcap/pcap_test.go b/pcap/pcap_test.go
@@ -15,9 +15,7 @@ func TestDecode(t *testing.T) {
defer f.Close()
gheader := GlobalHeader{
- VersionMajor: 2,
- VersionMinor: 4,
- SnapLen: 524288,
+ SnapLen: 524288,
}
header := Header{
// from tcpdump -tt -r testdata/text_udp.pcap