commit abc6381f91d6b8e36cfafad15375034229a640b8 from: Oliver Lowe date: Thu Jul 10 10:30:59 2025 UTC rtp: tidy marshal, unmarshal commit - 3faffc6a916cf7e63b45d795ef3c1d1be5441407 commit + abc6381f91d6b8e36cfafad15375034229a640b8 blob - 242e18c2a2144ff847b36e827ec131dcd5058876 blob + cf8fef00422e539a03046c44557fc8845df5e438 --- rtp/rtp.go +++ rtp/rtp.go @@ -134,6 +134,8 @@ const minHeaderLength = 12 func Unmarshal(data []byte, p *Packet) error { if len(data) < minHeaderLength { return fmt.Errorf("need at least %d bytes, have %d", minHeaderLength, len(data)) + } else if len(data) == minHeaderLength { + return ErrNoPayload } p.Header.Version = uint8(data[0] & 0b11000000) @@ -153,10 +155,8 @@ func Unmarshal(data []byte, p *Packet) error { p.Header.Timestamp = binary.BigEndian.Uint32(data[4:8]) p.Header.SyncSource = binary.BigEndian.Uint32(data[8:12]) - if len(data) == minHeaderLength { - return ErrNoPayload - } - data = data[12:] + // throw away unmarshalled bytes + data = data[minHeaderLength:] if hasExtension { if len(data) < 4 { @@ -194,6 +194,8 @@ func Unmarshal(data []byte, p *Packet) error { return nil } +const maxContribCount = 0x0f // max 4-bit integer + func Marshal(p *Packet) ([]byte, error) { if p.Header.Version > VersionRFC3550 { return nil, fmt.Errorf("bad version %v", p.Header.Version) @@ -206,7 +208,6 @@ func Marshal(p *Packet) ([]byte, error) { if p.Header.Extension != nil { buf[0] |= 0b00010000 } - maxContribCount := 0x0f // max 4-bit integer if len(p.Header.ContribSource) > maxContribCount { return nil, fmt.Errorf("contribution source count %d greater than max %d", len(p.Header.ContribSource), maxContribCount) } @@ -215,6 +216,7 @@ func Marshal(p *Packet) ([]byte, error) { if p.Header.Marker { buf[1] |= 0b10000000 } + if p.Header.Type > 0x7f { return nil, fmt.Errorf("payload type %s (%d) greater than max %d", p.Header.Type, p.Header.Type, 0x7f) }