1*4882a593SmuzhiyunFrom 91a3b5302d6a2467df70d3b43450991a53f9946b Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Hitendra Prajapati <hprajapati@mvista.com>
3*4882a593SmuzhiyunDate: Wed, 16 Nov 2022 11:24:25 +0530
4*4882a593SmuzhiyunSubject: [PATCH] CVE-2022-41741, CVE-2022-41742
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunUpstream-Status: Backport [https://github.com/nginx/nginx/commit/6b022a5556af22b6e18532e547a6ae46b0d8c6ea]
7*4882a593SmuzhiyunCVE: CVE-2022-41741, CVE-2022-41742
8*4882a593SmuzhiyunSigned-off-by: Hitendra Prajapati <hprajapati@mvista.com>
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunMp4: disabled duplicate atoms.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunMost atoms should not appear more than once in a container.  Previously,
13*4882a593Smuzhiyunthis was not enforced by the module, which could result in worker process
14*4882a593Smuzhiyuncrash, memory corruption and disclosure.
15*4882a593Smuzhiyun---
16*4882a593Smuzhiyun src/http/modules/ngx_http_mp4_module.c | 147 +++++++++++++++++++++++++
17*4882a593Smuzhiyun 1 file changed, 147 insertions(+)
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundiff --git a/src/http/modules/ngx_http_mp4_module.c b/src/http/modules/ngx_http_mp4_module.c
20*4882a593Smuzhiyunindex 0e93fbd..4f4d89d 100644
21*4882a593Smuzhiyun--- a/src/http/modules/ngx_http_mp4_module.c
22*4882a593Smuzhiyun+++ b/src/http/modules/ngx_http_mp4_module.c
23*4882a593Smuzhiyun@@ -1070,6 +1070,12 @@ ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
24*4882a593Smuzhiyun         return NGX_ERROR;
25*4882a593Smuzhiyun     }
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun+    if (mp4->ftyp_atom.buf) {
28*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
29*4882a593Smuzhiyun+                      "duplicate mp4 ftyp atom in \"%s\"", mp4->file.name.data);
30*4882a593Smuzhiyun+        return NGX_ERROR;
31*4882a593Smuzhiyun+    }
32*4882a593Smuzhiyun+
33*4882a593Smuzhiyun     atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun     ftyp_atom = ngx_palloc(mp4->request->pool, atom_size);
36*4882a593Smuzhiyun@@ -1128,6 +1134,12 @@ ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
37*4882a593Smuzhiyun         return NGX_DECLINED;
38*4882a593Smuzhiyun     }
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun+    if (mp4->moov_atom.buf) {
41*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
42*4882a593Smuzhiyun+                      "duplicate mp4 moov atom in \"%s\"", mp4->file.name.data);
43*4882a593Smuzhiyun+        return NGX_ERROR;
44*4882a593Smuzhiyun+    }
45*4882a593Smuzhiyun+
46*4882a593Smuzhiyun     conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun     if (atom_data_size > mp4->buffer_size) {
49*4882a593Smuzhiyun@@ -1195,6 +1207,12 @@ ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom");
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun+    if (mp4->mdat_atom.buf) {
54*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
55*4882a593Smuzhiyun+                      "duplicate mp4 mdat atom in \"%s\"", mp4->file.name.data);
56*4882a593Smuzhiyun+        return NGX_ERROR;
57*4882a593Smuzhiyun+    }
58*4882a593Smuzhiyun+
59*4882a593Smuzhiyun     data = &mp4->mdat_data_buf;
60*4882a593Smuzhiyun     data->file = &mp4->file;
61*4882a593Smuzhiyun     data->in_file = 1;
62*4882a593Smuzhiyun@@ -1321,6 +1339,12 @@ ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom");
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun+    if (mp4->mvhd_atom.buf) {
67*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
68*4882a593Smuzhiyun+                      "duplicate mp4 mvhd atom in \"%s\"", mp4->file.name.data);
69*4882a593Smuzhiyun+        return NGX_ERROR;
70*4882a593Smuzhiyun+    }
71*4882a593Smuzhiyun+
72*4882a593Smuzhiyun     atom_header = ngx_mp4_atom_header(mp4);
73*4882a593Smuzhiyun     mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header;
74*4882a593Smuzhiyun     mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header;
75*4882a593Smuzhiyun@@ -1586,6 +1610,13 @@ ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
76*4882a593Smuzhiyun     atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
79*4882a593Smuzhiyun+
80*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf) {
81*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
82*4882a593Smuzhiyun+                      "duplicate mp4 tkhd atom in \"%s\"", mp4->file.name.data);
83*4882a593Smuzhiyun+        return NGX_ERROR;
84*4882a593Smuzhiyun+    }
85*4882a593Smuzhiyun+
86*4882a593Smuzhiyun     trak->tkhd_size = atom_size;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun     ngx_mp4_set_32value(tkhd_atom->size, atom_size);
89*4882a593Smuzhiyun@@ -1624,6 +1655,12 @@ ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf) {
94*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
95*4882a593Smuzhiyun+                      "duplicate mp4 mdia atom in \"%s\"", mp4->file.name.data);
96*4882a593Smuzhiyun+        return NGX_ERROR;
97*4882a593Smuzhiyun+    }
98*4882a593Smuzhiyun+
99*4882a593Smuzhiyun     atom = &trak->mdia_atom_buf;
100*4882a593Smuzhiyun     atom->temporary = 1;
101*4882a593Smuzhiyun     atom->pos = atom_header;
102*4882a593Smuzhiyun@@ -1747,6 +1784,13 @@ ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
103*4882a593Smuzhiyun     atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
106*4882a593Smuzhiyun+
107*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf) {
108*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
109*4882a593Smuzhiyun+                      "duplicate mp4 mdhd atom in \"%s\"", mp4->file.name.data);
110*4882a593Smuzhiyun+        return NGX_ERROR;
111*4882a593Smuzhiyun+    }
112*4882a593Smuzhiyun+
113*4882a593Smuzhiyun     trak->mdhd_size = atom_size;
114*4882a593Smuzhiyun     trak->timescale = timescale;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun@@ -1789,6 +1833,12 @@ ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf) {
121*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
122*4882a593Smuzhiyun+                      "duplicate mp4 hdlr atom in \"%s\"", mp4->file.name.data);
123*4882a593Smuzhiyun+        return NGX_ERROR;
124*4882a593Smuzhiyun+    }
125*4882a593Smuzhiyun+
126*4882a593Smuzhiyun     atom = &trak->hdlr_atom_buf;
127*4882a593Smuzhiyun     atom->temporary = 1;
128*4882a593Smuzhiyun     atom->pos = atom_header;
129*4882a593Smuzhiyun@@ -1817,6 +1867,12 @@ ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_MINF_ATOM].buf) {
134*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
135*4882a593Smuzhiyun+                      "duplicate mp4 minf atom in \"%s\"", mp4->file.name.data);
136*4882a593Smuzhiyun+        return NGX_ERROR;
137*4882a593Smuzhiyun+    }
138*4882a593Smuzhiyun+
139*4882a593Smuzhiyun     atom = &trak->minf_atom_buf;
140*4882a593Smuzhiyun     atom->temporary = 1;
141*4882a593Smuzhiyun     atom->pos = atom_header;
142*4882a593Smuzhiyun@@ -1860,6 +1916,15 @@ ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf
147*4882a593Smuzhiyun+        || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf)
148*4882a593Smuzhiyun+    {
149*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
150*4882a593Smuzhiyun+                      "duplicate mp4 vmhd/smhd atom in \"%s\"",
151*4882a593Smuzhiyun+                      mp4->file.name.data);
152*4882a593Smuzhiyun+        return NGX_ERROR;
153*4882a593Smuzhiyun+    }
154*4882a593Smuzhiyun+
155*4882a593Smuzhiyun     atom = &trak->vmhd_atom_buf;
156*4882a593Smuzhiyun     atom->temporary = 1;
157*4882a593Smuzhiyun     atom->pos = atom_header;
158*4882a593Smuzhiyun@@ -1891,6 +1956,15 @@ ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf
163*4882a593Smuzhiyun+        || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf)
164*4882a593Smuzhiyun+    {
165*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
166*4882a593Smuzhiyun+                      "duplicate mp4 vmhd/smhd atom in \"%s\"",
167*4882a593Smuzhiyun+                      mp4->file.name.data);
168*4882a593Smuzhiyun+        return NGX_ERROR;
169*4882a593Smuzhiyun+    }
170*4882a593Smuzhiyun+
171*4882a593Smuzhiyun     atom = &trak->smhd_atom_buf;
172*4882a593Smuzhiyun     atom->temporary = 1;
173*4882a593Smuzhiyun     atom->pos = atom_header;
174*4882a593Smuzhiyun@@ -1922,6 +1996,12 @@ ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_DINF_ATOM].buf) {
179*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
180*4882a593Smuzhiyun+                      "duplicate mp4 dinf atom in \"%s\"", mp4->file.name.data);
181*4882a593Smuzhiyun+        return NGX_ERROR;
182*4882a593Smuzhiyun+    }
183*4882a593Smuzhiyun+
184*4882a593Smuzhiyun     atom = &trak->dinf_atom_buf;
185*4882a593Smuzhiyun     atom->temporary = 1;
186*4882a593Smuzhiyun     atom->pos = atom_header;
187*4882a593Smuzhiyun@@ -1950,6 +2030,12 @@ ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STBL_ATOM].buf) {
192*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
193*4882a593Smuzhiyun+                      "duplicate mp4 stbl atom in \"%s\"", mp4->file.name.data);
194*4882a593Smuzhiyun+        return NGX_ERROR;
195*4882a593Smuzhiyun+    }
196*4882a593Smuzhiyun+
197*4882a593Smuzhiyun     atom = &trak->stbl_atom_buf;
198*4882a593Smuzhiyun     atom->temporary = 1;
199*4882a593Smuzhiyun     atom->pos = atom_header;
200*4882a593Smuzhiyun@@ -2018,6 +2104,12 @@ ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STSD_ATOM].buf) {
205*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
206*4882a593Smuzhiyun+                      "duplicate mp4 stsd atom in \"%s\"", mp4->file.name.data);
207*4882a593Smuzhiyun+        return NGX_ERROR;
208*4882a593Smuzhiyun+    }
209*4882a593Smuzhiyun+
210*4882a593Smuzhiyun     atom = &trak->stsd_atom_buf;
211*4882a593Smuzhiyun     atom->temporary = 1;
212*4882a593Smuzhiyun     atom->pos = atom_header;
213*4882a593Smuzhiyun@@ -2086,6 +2178,13 @@ ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
214*4882a593Smuzhiyun     atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
217*4882a593Smuzhiyun+
218*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STTS_ATOM].buf) {
219*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
220*4882a593Smuzhiyun+                      "duplicate mp4 stts atom in \"%s\"", mp4->file.name.data);
221*4882a593Smuzhiyun+        return NGX_ERROR;
222*4882a593Smuzhiyun+    }
223*4882a593Smuzhiyun+
224*4882a593Smuzhiyun     trak->time_to_sample_entries = entries;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun     atom = &trak->stts_atom_buf;
227*4882a593Smuzhiyun@@ -2291,6 +2390,13 @@ ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
228*4882a593Smuzhiyun                    "sync sample entries:%uD", entries);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
231*4882a593Smuzhiyun+
232*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STSS_ATOM].buf) {
233*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
234*4882a593Smuzhiyun+                      "duplicate mp4 stss atom in \"%s\"", mp4->file.name.data);
235*4882a593Smuzhiyun+        return NGX_ERROR;
236*4882a593Smuzhiyun+    }
237*4882a593Smuzhiyun+
238*4882a593Smuzhiyun     trak->sync_samples_entries = entries;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun     atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t);
241*4882a593Smuzhiyun@@ -2489,6 +2595,13 @@ ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
242*4882a593Smuzhiyun                    "composition offset entries:%uD", entries);
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
245*4882a593Smuzhiyun+
246*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf) {
247*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
248*4882a593Smuzhiyun+                      "duplicate mp4 ctts atom in \"%s\"", mp4->file.name.data);
249*4882a593Smuzhiyun+        return NGX_ERROR;
250*4882a593Smuzhiyun+    }
251*4882a593Smuzhiyun+
252*4882a593Smuzhiyun     trak->composition_offset_entries = entries;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun     atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t);
255*4882a593Smuzhiyun@@ -2692,6 +2805,13 @@ ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
256*4882a593Smuzhiyun     atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t);
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
259*4882a593Smuzhiyun+
260*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STSC_ATOM].buf) {
261*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
262*4882a593Smuzhiyun+                      "duplicate mp4 stsc atom in \"%s\"", mp4->file.name.data);
263*4882a593Smuzhiyun+        return NGX_ERROR;
264*4882a593Smuzhiyun+    }
265*4882a593Smuzhiyun+
266*4882a593Smuzhiyun     trak->sample_to_chunk_entries = entries;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun     atom = &trak->stsc_atom_buf;
269*4882a593Smuzhiyun@@ -3024,6 +3144,13 @@ ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
270*4882a593Smuzhiyun                    "sample uniform size:%uD, entries:%uD", size, entries);
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
273*4882a593Smuzhiyun+
274*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf) {
275*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
276*4882a593Smuzhiyun+                      "duplicate mp4 stsz atom in \"%s\"", mp4->file.name.data);
277*4882a593Smuzhiyun+        return NGX_ERROR;
278*4882a593Smuzhiyun+    }
279*4882a593Smuzhiyun+
280*4882a593Smuzhiyun     trak->sample_sizes_entries = entries;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun     atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t);
283*4882a593Smuzhiyun@@ -3207,6 +3334,16 @@ ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
284*4882a593Smuzhiyun     atom_end = atom_table + entries * sizeof(uint32_t);
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
287*4882a593Smuzhiyun+
288*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf
289*4882a593Smuzhiyun+        || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf)
290*4882a593Smuzhiyun+    {
291*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
292*4882a593Smuzhiyun+                      "duplicate mp4 stco/co64 atom in \"%s\"",
293*4882a593Smuzhiyun+                      mp4->file.name.data);
294*4882a593Smuzhiyun+        return NGX_ERROR;
295*4882a593Smuzhiyun+    }
296*4882a593Smuzhiyun+
297*4882a593Smuzhiyun     trak->chunks = entries;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun     atom = &trak->stco_atom_buf;
300*4882a593Smuzhiyun@@ -3413,6 +3550,16 @@ ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
301*4882a593Smuzhiyun     atom_end = atom_table + entries * sizeof(uint64_t);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun     trak = ngx_mp4_last_trak(mp4);
304*4882a593Smuzhiyun+
305*4882a593Smuzhiyun+    if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf
306*4882a593Smuzhiyun+        || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf)
307*4882a593Smuzhiyun+    {
308*4882a593Smuzhiyun+        ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
309*4882a593Smuzhiyun+                      "duplicate mp4 stco/co64 atom in \"%s\"",
310*4882a593Smuzhiyun+                      mp4->file.name.data);
311*4882a593Smuzhiyun+        return NGX_ERROR;
312*4882a593Smuzhiyun+    }
313*4882a593Smuzhiyun+
314*4882a593Smuzhiyun     trak->chunks = entries;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun     atom = &trak->co64_atom_buf;
317*4882a593Smuzhiyun--
318*4882a593Smuzhiyun2.25.1
319*4882a593Smuzhiyun
320