[PATCH 2 of 2] Tests: additional tests for various mp4 issues
Maxim Dounin
mdounin at mdounin.ru
Sun Mar 8 02:46:24 UTC 2026
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1772937920 -10800
# Sun Mar 08 05:45:20 2026 +0300
# Node ID e9c5bc1ae12bb62cce7289339b9638fa277ae5ab
# Parent c92474d354a0248fd1d5712d91bfc28d8583ffa9
Tests: additional tests for various mp4 issues.
diff --git a/mp4_bad.t b/mp4_bad.t
--- a/mp4_bad.t
+++ b/mp4_bad.t
@@ -23,7 +23,7 @@ use Test::Nginx;
select STDERR; $| = 1;
select STDOUT; $| = 1;
-my $t = Test::Nginx->new()->has(qw/http mp4/)->plan(1)
+my $t = Test::Nginx->new()->has(qw/http mp4/)->plan(4)
->write_file_expand('nginx.conf', <<'EOF');
%%TEST_GLOBALS%%
@@ -42,6 +42,8 @@ http {
location / {
mp4;
+ mp4_start_key_frame on;
+ postpone_output 0;
}
}
}
@@ -70,7 +72,106 @@ 00000000: 00 00 00 18 63 6f 36 34 00 0
00000000: ff ff ff ff f0 0f fb e7 |........|
EOF
+# zero entry in stss causes incorrect access during stts processing
+
+my $bad_key_frame = <<'EOF';
+00000000: 00 00 00 1c 66 74 79 70 69 73 6f 6d 00 00 02 00 |....ftypisom....|
+00000000: 69 73 6f 6d 69 73 6f 32 6d 70 34 31 |isomiso2mp41|
+00000000: 00 00 00 08 6d 64 61 74 |....mdat|
+00000000: 00 00 00 b4 6d 6f 6f 76 |....moov|
+00000000: 00 00 00 ac 74 72 61 6b |....trak|
+00000000: 00 00 00 a4 6d 64 69 61 |....mdia|
+00000000: 00 00 00 9c 6d 69 6e 66 |....minf|
+00000000: 00 00 00 94 73 74 62 6c |....stbl|
+00000000: 00 00 00 18 73 74 74 73 00 00 00 00 00 00 00 01 |....stts........|
+00000000: 00 00 03 3a 00 00 04 00 |........|
+00000000: 00 00 00 28 73 74 73 63 00 00 00 00 00 00 00 02 |....stsc........|
+00000000: 00 00 00 01 ff ff ff ff 00 00 00 00 |............|
+00000000: 00 00 00 02 ff ff ff ff 00 00 00 00 |............|
+00000000: 00 00 00 14 73 74 73 7a 00 00 00 00 00 00 05 a9 |....stsz........|
+00000000: 00 00 03 3b |....|
+00000000: 00 00 00 18 73 74 63 6f 00 00 00 00 00 00 00 02 |....stco........|
+00000000: 00 00 00 00 00 00 ff ff |........|
+00000000: 00 00 00 20 73 74 73 73 00 00 00 00 00 00 00 01 |....stss........|
+00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
+EOF
+
+# entries check overflow on 32bit platforms
+
+my $bad_entries_overflow = <<'EOF';
+00000000: 00 00 00 1c 66 74 79 70 69 73 6f 6d 00 00 02 00 |....ftypisom....|
+00000000: 69 73 6f 6d 69 73 6f 32 6d 70 34 31 |isomiso2mp41|
+00000000: 00 00 00 08 6d 64 61 74 |....mdat|
+00000000: 00 00 00 c4 6d 6f 6f 76 |....moov|
+00000000: 00 00 00 bc 74 72 61 6b |....trak|
+00000000: 00 00 00 b4 6d 64 69 61 |....mdia|
+00000000: 00 00 00 20 6d 64 68 64 00 00 00 00 |....mdhd....|
+00000000: 00 00 00 00 00 00 00 00 00 00 03 e8 ff ff ff ff |................|
+00000000: 00 00 00 00 |....|
+00000000: 00 00 00 8c 6d 69 6e 66 |....minf|
+00000000: 00 00 00 84 73 74 62 6c |....stbl|
+00000000: 00 00 00 18 73 74 74 73 00 00 00 00 00 00 00 01 |....stts........|
+00000000: ff ff ff ff 00 00 00 01 |........|
+00000000: 00 00 00 28 73 74 73 63 00 00 00 00 00 00 00 01 |....stsc........|
+00000000: 00 00 00 01 00 00 00 01 00 00 00 00 |............|
+00000000: 00 ff ff ff 00 00 00 ff 00 00 00 00 |............|
+00000000: 00 00 00 14 73 74 73 7a 00 00 00 00 00 00 05 a9 |....stsz........|
+00000000: 00 00 03 3b |....|
+00000000: 00 00 00 28 73 74 63 6f 00 00 00 00 40 00 00 01 |....stco........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+EOF
+
+# stco/co64 entries check off-by-one
+
+my $bad_entries_offbyone = <<'EOF';
+00000000: 00 00 00 1c 66 74 79 70 69 73 6f 6d 00 00 02 00 |....ftypisom....|
+00000000: 69 73 6f 6d 69 73 6f 32 6d 70 34 31 |isomiso2mp41|
+00000000: 00 00 00 08 6d 64 61 74 |....mdat|
+00000000: 00 00 01 80 6d 6f 6f 76 |....moov|
+00000000: 00 00 00 bc 74 72 61 6b |....trak|
+00000000: 00 00 00 b4 6d 64 69 61 |....mdia|
+00000000: 00 00 00 20 6d 64 68 64 00 00 00 00 |....mdhd....|
+00000000: 00 00 00 00 00 00 00 00 00 00 03 e8 ff ff ff ff |................|
+00000000: 00 00 00 00 |....|
+00000000: 00 00 00 8c 6d 69 6e 66 |....minf|
+00000000: 00 00 00 84 73 74 62 6c |....stbl|
+00000000: 00 00 00 18 73 74 74 73 00 00 00 00 00 00 00 01 |....stts........|
+00000000: ff ff ff ff 00 00 00 01 |........|
+00000000: 00 00 00 28 73 74 73 63 00 00 00 00 00 00 00 02 |....stsc........|
+00000000: 00 00 00 01 00 00 00 01 00 00 00 00 |............|
+00000000: 00 ff ff ff 00 00 00 ff 00 00 00 00 |............|
+00000000: 00 00 00 14 73 74 73 7a 00 00 00 00 00 00 05 a9 |....stsz........|
+00000000: 00 00 03 3b |....|
+00000000: 00 00 00 28 73 74 63 6f 00 00 00 00 00 00 00 06 |....stco........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 bc 74 72 61 6b |....trak|
+00000000: 00 00 00 b4 6d 64 69 61 |....mdia|
+00000000: 00 00 00 20 6d 64 68 64 00 00 00 00 |....mdhd....|
+00000000: 00 00 00 00 00 00 00 00 00 00 03 e8 ff ff ff ff |................|
+00000000: 00 00 00 00 |....|
+00000000: 00 00 00 8c 6d 69 6e 66 |....minf|
+00000000: 00 00 00 84 73 74 62 6c |....stbl|
+00000000: 00 00 00 18 73 74 74 73 00 00 00 00 00 00 00 01 |....stts........|
+00000000: ff ff ff ff 00 00 00 01 |........|
+00000000: 00 00 00 28 73 74 73 63 00 00 00 00 00 00 00 02 |....stsc........|
+00000000: 00 00 00 01 00 00 00 01 00 00 00 00 |............|
+00000000: 00 ff ff ff 00 00 00 ff 00 00 00 00 |............|
+00000000: 00 00 00 14 73 74 73 7a 00 00 00 00 00 00 05 a9 |....stsz........|
+00000000: 00 00 03 3b |....|
+00000000: 00 00 00 28 73 74 63 6f 00 00 00 00 00 00 00 01 |....stco........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+00000000: 00 00 00 00 00 00 00 00 |........|
+EOF
+
$t->write_file('bad_co64.mp4', unhex($bad_co64));
+$t->write_file('bad_key_frame.mp4', unhex($bad_key_frame));
+$t->write_file('bad_entries_overflow.mp4', unhex($bad_entries_overflow));
+$t->write_file('bad_entries_offbyone.mp4', unhex($bad_entries_offbyone));
$t->run();
@@ -79,6 +180,21 @@ EOF
like(http_get("/bad_co64.mp4?start=0.5"), qr/500 Internal/,
'co64 chunk after eof');
+TODO: {
+local $TODO = 'not yet', $t->todo_alerts()
+ unless $t->has_version('1.29.6');
+
+like(http_get("/bad_key_frame.mp4?start=0.5"), qr/200 OK/,
+ 'stss with zero entry');
+
+like(http_get("/bad_entries_overflow.mp4?start=0.005"), qr/500 Internal/,
+ 'stco entries 32bit overflow');
+
+like(http_get("/bad_entries_offbyone.mp4?start=0.001"), qr/500 Internal/,
+ 'stco entries off-by-one');
+
+}
+
###############################################################################
sub unhex {
More information about the nginx-devel
mailing list