Skip to content

Commit ec45de0

Browse files
alfredoyangkinetiknz
authored andcommitted
check descriptor length before parsing
1 parent c714e7e commit ec45de0

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

mp4parse/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1376,7 +1376,8 @@ fn find_descriptor(data: &[u8], esds: &mut ES_Descriptor) -> Result<()> {
13761376

13771377
let mut remains = data;
13781378

1379-
while !remains.is_empty() {
1379+
// Descriptor length should be more than 2 bytes.
1380+
while remains.len() > 2 {
13801381
let des = &mut Cursor::new(remains);
13811382
let tag = des.read_u8()?;
13821383

mp4parse/src/tests.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,28 @@ fn read_esds_invalid_descriptor() {
11071107
}
11081108
}
11091109

1110+
#[test]
1111+
fn read_esds_redundant_descriptor() {
1112+
// the '2' at the end is redundant data.
1113+
let esds =
1114+
vec![ 3, 25, 0, 1, 0, 4, 19, 64,
1115+
21, 0, 0, 0, 0, 0, 0, 0,
1116+
0, 1, 119, 0, 5, 2, 18, 16,
1117+
6, 1, 2,
1118+
];
1119+
1120+
let mut stream = make_box(BoxSize::Auto, b"esds", |s| {
1121+
s.B32(0) // reserved
1122+
.append_bytes(esds.as_slice())
1123+
});
1124+
let mut iter = super::BoxIter::new(&mut stream);
1125+
let mut stream = iter.next_box().unwrap().unwrap();
1126+
1127+
match super::read_esds(&mut stream) {
1128+
Ok(esds) => assert_eq!(esds.audio_codec, super::CodecType::AAC),
1129+
_ => panic!("unexpected result with invalid descriptor"),
1130+
}
1131+
}
11101132

11111133
#[test]
11121134
fn read_invalid_pssh() {

0 commit comments

Comments
 (0)