[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