srs/trunk/doc
Winlin 0f980d49a6
RTMP: Fix chunk timestamp/basic-header decoding and harden packet unmarshal. v8.0.3 (#4680)
Fixes three RTMP chunk-stream decoding bugs in the proxy and hardens AMF0 command-packet unmarshalling against malformed input, backed by a new protocol unit-test suite.

All changes are confined to the `internal/rtmp` package. No public API, log format, or emitted wire format changes — these are decode-correctness and robustness fixes only.

**3-byte chunk basic header decode (`readBasicHeader`) **

The 3-byte basic-header form (cid 64–65599) was selected by testing `cid == 1` *after* `cid` had already been overwritten with `64 + t`, so it was never detected. Capture the original marker before overwriting and test that instead.

**Extended-timestamp handling (`chunkStream`, `readMessageHeader`)**

- Use the extended timestamp as a delta for fmt=1/2 chunks (and a fmt=3 first chunk continuing them), required when the delta is ≥ `0xffffff`. Timestamp computation is unified into a single post-step: extended timestamp when present, otherwise the 3-byte header delta; fmt=0 absolute, fmt=1/2 accumulated.
- Detect Type-3 chunks that omit the extended timestamp. FMLE/FMS/Flash follow the RTMP 2012 spec and always send it on Type-3 chunks; librtmp/ffmpeg may not. Switched from an unconditional 4-byte read to `Peek` + conditional `Discard`: if the peeked value differs from the stored one on a non-first chunk, those 4 bytes are payload and are left in the reader.
- Split the single `extendedTimestamp` bool into `hasExtendedTimestamp` (bool) and `extendedTimestamp` (the last raw value, used for the detection above).

**Packet unmarshal hardening**
- Add an `advanceBytes(p, n)` helper that bounds-checks each `p = p[field.Size():]` advance, turning a slice-out-of-range panic into a clean error on truncated/untrusted input. Applied in `CallPacket`, `CreateStreamResPacket`, `PublishPacket`, and `PlayPacket`.
- Reset the optional `CommandObject` / `Args` to nil before probing for their presence, so a stale constructor default (e.g. Null) isn't counted by `Size()` and can't overflow a later advance.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 07:17:32 -04:00
..
Architecture.md GB28181: Fix bug for parsing GB to RTC. 2022-10-07 19:47:34 +08:00
CHANGELOG.md RTMP: Fix chunk timestamp/basic-header decoding and harden packet unmarshal. v8.0.3 (#4680) 2026-05-29 07:17:32 -04:00
Dockers.md Use new cache image name. v6.0.86 (#3815) 2023-10-08 07:43:14 -05:00
Features.md OpenClaw: Create knowledge base for AI robot (#4636) 2026-02-14 08:42:16 -05:00
ffmpeg-logo.png support ffmpeg filter 2013-12-01 10:54:41 +08:00
ffmpeg-min.png add drawtext filter sample 2013-12-01 12:04:00 +08:00
PERFORMANCE.md Improve README and documents with AI. v5.0.153. v6.0.43 (#3538) 2023-05-12 17:18:30 +08:00
README.md Micro changes and refines. 2022-09-30 17:57:48 +08:00
readme.txt Move doc 2020-01-26 11:14:18 +08:00
Resources.md Merge 4.0release, migrate to new website. 2022-07-31 18:34:18 +08:00
source.200kbps.768x320.flv update readme, add hls(audio-only) support to readme. update sample flv from h264+mp3 to h264+aac 2014-03-21 11:38:02 +08:00
source.flv SquashSRS4: Support RTC2RTMP. 2021-05-01 22:15:57 +08:00
srs-logo.ico Windows: Support cygwin pipline and packager. v5.0.89 (#3257) 2022-11-20 15:02:08 +08:00
srs-logo.png remove the libfreetype for it fullfill with bugs and always cause build failed. 0.9.139 2014-06-29 10:43:53 +08:00