diff --git a/src/liboggz/dirac.c b/src/liboggz/dirac.c index 7392c4e573dec383eb3c141a0db8de9c7ccb878a..9e412e21cdc10a56ab39edeec8a3fa33fa9973ed 100644 --- a/src/liboggz/dirac.c +++ b/src/liboggz/dirac.c @@ -119,9 +119,18 @@ dirac_parse_info (dirac_info *info, unsigned char * data, long len) ogg_uint32_t fps_numerator, fps_denominator; } dirac_frate_tbl[] = { /* table 10.3 */ {1,1}, /* this first value is never used */ - {24000,1001}, {24,1}, {25,1}, {30000,1001}, {30,1}, - {50,1}, {60000,1001}, {60,1}, {15000,1001}, {25,2} + {24000,1001}, + {24,1}, + {25,1}, + {30000,1001}, + {30,1}, + {50,1}, + {60000,1001}, + {60,1}, + {15000,1001}, + {25,2} }; +#define DIRAC_FRATE_TBL_LEN (sizeof(dirac_fsize_tbl) / sizeof(dirac_fsize_tbl[0])) static const ogg_uint32_t dirac_vidfmt_frate[] = { /* table C.1 */ 1, 9, 10, 9, 10, 9, 10, 4, 3, 7, 6, 4, 3, 7, 6, 2, 2, 7, 6, 7, 6 @@ -152,7 +161,7 @@ dirac_parse_info (dirac_info *info, unsigned char * data, long len) info->level = dirac_uint( &bs ); /* level */ info->video_format = video_format = dirac_uint( &bs ); /* index */ - if (video_format >= (sizeof(dirac_fsize_tbl) / sizeof(dirac_fsize_tbl[0]))) { + if (video_format >= DIRAC_FRATE_TBL_LEN) { return -1; } @@ -184,6 +193,11 @@ dirac_parse_info (dirac_info *info, unsigned char * data, long len) info->fps_denominator = dirac_frate_tbl[dirac_vidfmt_frate[video_format]].fps_denominator; if (dirac_bool( &bs )) { ogg_uint32_t frame_rate_index = dirac_uint( &bs ); + + if (frame_rate_index >= DIRAC_FRATE_TBL_LEN) { + return -1; + } + info->fps_numerator = dirac_frate_tbl[frame_rate_index].fps_numerator; info->fps_denominator = dirac_frate_tbl[frame_rate_index].fps_denominator; if (frame_rate_index == 0) {