{"record":{"id":"c47fd37ec5c90f8b","repo":"pion/webrtc","slug":"payload-for-id-page-must-be-19-bytes","errorCode":null,"errorMessage":"payload for id page must be 19 bytes","messagePattern":"payload for id page must be 19 bytes","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/media/oggreader/oggreader.go","lineNumber":28,"sourceCode":"\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\nconst (\n\tpageHeaderTypeBeginningOfStream = 0x02\n\tpageHeaderSignature             = \"OggS\"\n\n\tidPageBasePayloadLength = 19\n\tpageHeaderLen           = 27\n)\n\nvar (\n\terrNilStream                       = errors.New(\"stream is nil\")\n\terrBadIDPageSignature              = errors.New(\"bad header signature\")\n\terrBadOpusTagsSignature            = errors.New(\"bad opus tags signature\")\n\terrBadIDPageType                   = errors.New(\"wrong header, expected beginning of stream\")\n\terrBadIDPageLength                 = errors.New(\"payload for id page must be 19 bytes\")\n\terrBadIDPagePayloadSignature       = errors.New(\"bad payload signature\")\n\terrShortPageHeader                 = errors.New(\"not enough data for payload header\")\n\terrChecksumMismatch                = errors.New(\"expected and actual checksum do not match\")\n\terrUnsupportedChannelMappingFamily = errors.New(\"unsupported channel mapping family\")\n)\n\n// OggReader is used to read Ogg files and return page payloads.\ntype OggReader struct {\n\tstream               io.Reader\n\tbytesReadSuccesfully int64\n\tchecksumTable        *[256]uint32\n\tdoChecksum           bool\n}\n\n// OggHeader contains Opus codec metadata parsed from an Opus ID page.\n// This header is extracted from an Ogg page payload that starts with the OpusHead\n// signature (the first page of an Opus stream in an Ogg container).\n//","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/pion/webrtc/blob/8c25dc09fa9e7c09aac4309ead88093d760432b0/pkg/media/oggreader/oggreader.go#L10-L46","documentation":"errBadIDPageLength is returned when the Opus ID header payload is shorter than the required 19 bytes (idPageBasePayloadLength). The OpusHead structure is fixed-size up to the channel mapping section, so a shorter payload cannot be parsed. It is returned from ParseOpusHead, validateOpusPageHeader, and validatePayloadLength.","triggerScenarios":"Passing a []byte payload of len < 19 to ParseOpusHead (oggreader.go:68), or an ID page whose payload is truncated (oggreader.go:213).","commonSituations":"Manually constructed OpusHead payloads missing bytes, packets truncated by a network/packetizer bug, hand-rolled test fixtures with incomplete ID headers.","solutions":["Ensure the payload passed to ParseOpusHead is at least 19 bytes","Check len(payload) before calling ParseOpusHead","If building packets yourself, include the full OpusHead: 'OpusHead' magic, version, channels, pre-skip, sample rate, gain, mapping family"],"exampleFix":"// before\nhead, err := oggreader.ParseOpusHead(payload[:10])\n// after\nif len(payload) < 19 {\n    return fmt.Errorf(\"opus id payload too short: %d\", len(payload))\n}\nhead, err := oggreader.ParseOpusHead(payload)","handlingStrategy":"validation","validationCode":"if payload == nil || len(payload) < 19 {\n    return fmt.Errorf(\"opus id payload must be >= 19 bytes, got %d\", len(payload))\n}\nhead, err := oggreader.ParseOpusHead(payload)","typeGuard":"func isFullOpusHead(payload []byte) bool {\n    return len(payload) >= 19 && bytes.HasPrefix(payload, []byte(\"OpusHead\"))\n}","tryCatchPattern":"head, err := oggreader.ParseOpusHead(payload)\nif errors.Is(err, oggreader.ErrBadIDPageLength) {\n    return fmt.Errorf(\"truncated OpusHead: %w\", err)\n}","preventionTips":["Keep OpusHead payloads intact end-to-end; do not slice packets arbitrarily","Validate len(payload) at the network boundary before parsing","Build test fixtures from real encoder output, not hand-typed bytes"],"tags":["ogg","opus","validation","audio"],"backgroundTag":"payload-too-short","analyzedSha":"8c25dc09fa9e7c09aac4309ead88093d760432b0","analyzedAt":"2026-09-03T21:56:56.182Z","contentChangedAt":"2026-09-03T21:56:56.182Z","schemaVersion":2},"datasetVersion":"2026-09-11T07:07:21.782Z"}