vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Fri Apr 18 20:07:18 2014 +0200| [9bf77558f48ee628598341c006b5bf16f4c525f4] | committer: Francois Cartegnie
demux: avi: do proper palette reading and checks > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9bf77558f48ee628598341c006b5bf16f4c525f4 --- modules/demux/avi/libavi.c | 19 +++++++++++++++++-- modules/demux/avi/libavi.h | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/demux/avi/libavi.c b/modules/demux/avi/libavi.c index 62126d0..6be415d 100644 --- a/modules/demux/avi/libavi.c +++ b/modules/demux/avi/libavi.c @@ -403,12 +403,27 @@ static int AVI_ChunkRead_strf( stream_t *s, avi_chunk_t *p_chk ) { p_chk->strf.vids.p_bih->biSize = p_chk->common.i_chunk_size; } - if( p_chk->common.i_chunk_size > sizeof(VLC_BITMAPINFOHEADER) ) + uint64_t i_extrasize = p_chk->common.i_chunk_size - sizeof(VLC_BITMAPINFOHEADER); + if( i_extrasize > 0 ) { + /* There's a color palette appended, set up VLC_BITMAPINFO */ memcpy( &p_chk->strf.vids.p_bih[1], p_buff + 8 + sizeof(VLC_BITMAPINFOHEADER), /* 8=fourrc+size */ - p_chk->common.i_chunk_size -sizeof(VLC_BITMAPINFOHEADER) ); + i_extrasize ); + + if ( !p_chk->strf.vids.p_bih->biClrUsed ) + p_chk->strf.vids.p_bih->biClrUsed = (1 << p_chk->strf.vids.p_bih->biBitCount); + + if( i_extrasize > (UINT32_MAX * sizeof(uint32_t)) ) + p_chk->strf.vids.p_bih->biClrUsed = UINT32_MAX; + else + { + p_chk->strf.vids.p_bih->biClrUsed = + __MAX( i_extrasize / sizeof(uint32_t), + p_chk->strf.vids.p_bih->biClrUsed ); + } } + else p_chk->strf.vids.p_bih->biClrUsed = 0; #ifdef AVI_DEBUG msg_Dbg( (vlc_object_t*)s, "strf: video:%4.4s %"PRIu32"x%"PRIu32" planes:%d %dbpp", diff --git a/modules/demux/avi/libavi.h b/modules/demux/avi/libavi.h index 4ae9aa6..2149223 100644 --- a/modules/demux/avi/libavi.h +++ b/modules/demux/avi/libavi.h @@ -122,7 +122,7 @@ typedef struct avi_chunk_strf_auds_s WAVEFORMATEX *p_wf; } avi_chunk_strf_auds_t; -typedef struct avi_chunk_strf_vids_s +typedef struct ATTR_PACKED avi_chunk_strf_vids_s { AVI_CHUNK_COMMON int i_cat; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits