aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2024-09-23 15:51:30 +0400
committerRoman Arutyunyan <arutyunyan.roman@gmail.com>2024-11-21 16:08:48 +0400
commit6ec099a3786f2ddbe007009d5526ff2ec9316d23 (patch)
tree9414252ea150320a0be09c6926c25fdbcdd4f418 /src
parentcb1857407bec54804191cfc5ac8173df44f0c661 (diff)
downloadnginx-6ec099a3786f2ddbe007009d5526ff2ec9316d23.tar.gz
nginx-6ec099a3786f2ddbe007009d5526ff2ec9316d23.zip
Mp4: fixed handling an empty run of chunks in stsc atom.
A specially crafted mp4 file with an empty run of chunks in the stsc atom and a large value for samples per chunk for that run, combined with a specially crafted request, allowed to store that large value in prev_samples and later in trak->end_chunk_samples while in ngx_http_mp4_crop_stsc_data(). Later in ngx_http_mp4_update_stsz_atom() this could result in buffer overread while calculating trak->end_chunk_samples_size. Now the value of samples per chunk specified for an empty run is ignored.
Diffstat (limited to 'src')
-rw-r--r--src/http/modules/ngx_http_mp4_module.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/http/modules/ngx_http_mp4_module.c b/src/http/modules/ngx_http_mp4_module.c
index 041ad263b..2ca059136 100644
--- a/src/http/modules/ngx_http_mp4_module.c
+++ b/src/http/modules/ngx_http_mp4_module.c
@@ -3176,7 +3176,10 @@ ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,
start_sample -= n;
- prev_samples = samples;
+ if (next_chunk > chunk) {
+ prev_samples = samples;
+ }
+
chunk = next_chunk;
samples = ngx_mp4_get_32value(entry->samples);
id = ngx_mp4_get_32value(entry->id);