]> git.feebdaed.xyz Git - 0xmirror/nginx.git/commitdiff
Mp4: unordered stsc chunks error for the final chunk.
authorRoman Arutyunyan <arut@nginx.com>
Wed, 2 Oct 2024 12:22:15 +0000 (16:22 +0400)
committerRoman Arutyunyan <arutyunyan.roman@gmail.com>
Thu, 21 Nov 2024 12:08:48 +0000 (16:08 +0400)
Currently an error is triggered if any of the chunk runs in stsc are
unordered.  This however does not include the final chunk run, which
ends with trak->chunks + 1.  The previous chunk index can be larger
leading to a 32-bit overflow.  This could allow to skip the validity
check "if (start_sample > n)".  This could later lead to a large
trak->start_chunk/trak->end_chunk, which would be caught later in
ngx_http_mp4_update_stco_atom() or ngx_http_mp4_update_co64_atom().

While there are no implications of the validity check being avoided,
the change still adds a check to ensure the final chunk run is ordered,
to produce a meaningful error and avoid a potential integer overflow.

src/http/modules/ngx_http_mp4_module.c

index 2ca0591367d257003226374a132f8d5d3e28240f..49b0999cf2d807ae475f1a1b24161af4bc3102ac 100644 (file)
@@ -3189,6 +3189,13 @@ ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,
 
     next_chunk = trak->chunks + 1;
 
+    if (next_chunk < chunk) {
+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
+                      "unordered mp4 stsc chunks in \"%s\"",
+                      mp4->file.name.data);
+        return NGX_ERROR;
+    }
+
     ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
                    "sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",
                    start_sample, chunk, next_chunk - chunk, samples);