@@ -158,18 +158,30 @@ void ES_h264::Parse(STREAM_PKT* pkt)
158158 {
159159 if (m_streamData.sps [0 ].raw_data_size )
160160 {
161- uint8_t *ed (stream_info.extra_data );
162- stream_info.extra_data_size = 4 + m_streamData.sps [0 ].raw_data_size ;
163- ed[0 ] = ed[1 ] = ed[2 ] = 0 , ed[3 ] = 1 , ed += 4 ;
164- memcpy (ed, m_streamData.sps [0 ].raw_data , m_streamData.sps [0 ].raw_data_size ), ed += m_streamData.sps [0 ].raw_data_size ;
161+ uint8_t * ed = stream_info.extra_data ;
162+ const uint8_t * edEnd = stream_info.extra_data + sizeof (stream_info.extra_data );
163+ stream_info.extra_data_size = 0 ;
164+
165+ // Append a parameter set NAL (SPS/PPS) as Annex B, bounded by the
166+ // destination buffer to avoid overflowing stream_info.extra_data
167+ auto appendNal = [&](const uint8_t * src, size_t n) -> bool {
168+ if (ed + 4 + n > edEnd)
169+ {
170+ DBG (DEMUX_DBG_INFO , " H.264: stream_info.extra_data too small! %u\n " ,
171+ static_cast <unsigned int >(stream_info.extra_data_size + 4 + n));
172+ return false ;
173+ }
174+ ed[0 ] = ed[1 ] = ed[2 ] = 0 , ed[3 ] = 1 , ed += 4 ;
175+ memcpy (ed, src, n), ed += n;
176+ stream_info.extra_data_size += 4 + n;
177+ return true ;
178+ };
179+
180+ appendNal (m_streamData.sps [0 ].raw_data , m_streamData.sps [0 ].raw_data_size );
165181 for (int i = 0 ; i < 256 ; ++i)
166182 {
167183 if (m_streamData.pps [i].raw_data_size )
168- {
169- ed[0 ] = ed[1 ] = ed[2 ] = 0 , ed[3 ] = 1 , ed += 4 ;
170- memcpy (ed, m_streamData.pps [i].raw_data , m_streamData.pps [i].raw_data_size ), ed += m_streamData.pps [i].raw_data_size ;
171- stream_info.extra_data_size += 4 + m_streamData.pps [i].raw_data_size ;
172- }
184+ appendNal (m_streamData.pps [i].raw_data , m_streamData.pps [i].raw_data_size );
173185 }
174186 }
175187 else
0 commit comments