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