Fixes: runtime error: index 49 out of bounds for type 'int [48][2][2]' Fixes: 2159/clusterfuzz-testcase-minimized-5267945972301824 Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>tags/n3.4
@@ -26,7 +26,8 @@ | |||||
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | ||||
const int *ref_count, int slice_type_nos, | const int *ref_count, int slice_type_nos, | ||||
H264PredWeightTable *pwt, void *logctx) | |||||
H264PredWeightTable *pwt, | |||||
int picture_structure, void *logctx) | |||||
{ | { | ||||
int list, i, j; | int list, i, j; | ||||
int luma_def, chroma_def; | int luma_def, chroma_def; | ||||
@@ -98,11 +99,13 @@ int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | |||||
} | } | ||||
// for MBAFF | // for MBAFF | ||||
pwt->luma_weight[16 + 2 * i][list][0] = pwt->luma_weight[16 + 2 * i + 1][list][0] = pwt->luma_weight[i][list][0]; | |||||
pwt->luma_weight[16 + 2 * i][list][1] = pwt->luma_weight[16 + 2 * i + 1][list][1] = pwt->luma_weight[i][list][1]; | |||||
for (j = 0; j < 2; j++) { | |||||
pwt->chroma_weight[16 + 2 * i][list][j][0] = pwt->chroma_weight[16 + 2 * i + 1][list][j][0] = pwt->chroma_weight[i][list][j][0]; | |||||
pwt->chroma_weight[16 + 2 * i][list][j][1] = pwt->chroma_weight[16 + 2 * i + 1][list][j][1] = pwt->chroma_weight[i][list][j][1]; | |||||
if (picture_structure == PICT_FRAME) { | |||||
pwt->luma_weight[16 + 2 * i][list][0] = pwt->luma_weight[16 + 2 * i + 1][list][0] = pwt->luma_weight[i][list][0]; | |||||
pwt->luma_weight[16 + 2 * i][list][1] = pwt->luma_weight[16 + 2 * i + 1][list][1] = pwt->luma_weight[i][list][1]; | |||||
for (j = 0; j < 2; j++) { | |||||
pwt->chroma_weight[16 + 2 * i][list][j][0] = pwt->chroma_weight[16 + 2 * i + 1][list][j][0] = pwt->chroma_weight[i][list][j][0]; | |||||
pwt->chroma_weight[16 + 2 * i][list][j][1] = pwt->chroma_weight[16 + 2 * i + 1][list][j][1] = pwt->chroma_weight[i][list][j][1]; | |||||
} | |||||
} | } | ||||
} | } | ||||
if (slice_type_nos != AV_PICTURE_TYPE_B) | if (slice_type_nos != AV_PICTURE_TYPE_B) | ||||
@@ -55,7 +55,8 @@ typedef struct H264POCContext { | |||||
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, | ||||
const int *ref_count, int slice_type_nos, | const int *ref_count, int slice_type_nos, | ||||
H264PredWeightTable *pwt, void *logctx); | |||||
H264PredWeightTable *pwt, | |||||
int picture_structure, void *logctx); | |||||
/** | /** | ||||
* Check if the top & left blocks are available if needed & change the | * Check if the top & left blocks are available if needed & change the | ||||
@@ -202,7 +202,7 @@ static int scan_mmco_reset(AVCodecParserContext *s, GetBitContext *gb, | |||||
if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || | if ((p->ps.pps->weighted_pred && slice_type_nos == AV_PICTURE_TYPE_P) || | ||||
(p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) | (p->ps.pps->weighted_bipred_idc == 1 && slice_type_nos == AV_PICTURE_TYPE_B)) | ||||
ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos, | ff_h264_pred_weight_table(gb, p->ps.sps, ref_count, slice_type_nos, | ||||
&pwt, logctx); | |||||
&pwt, p->picture_structure, logctx); | |||||
if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag | if (get_bits1(gb)) { // adaptive_ref_pic_marking_mode_flag | ||||
int i; | int i; | ||||
@@ -1801,7 +1801,8 @@ static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, | |||||
(pps->weighted_bipred_idc == 1 && | (pps->weighted_bipred_idc == 1 && | ||||
sl->slice_type_nos == AV_PICTURE_TYPE_B)) { | sl->slice_type_nos == AV_PICTURE_TYPE_B)) { | ||||
ret = ff_h264_pred_weight_table(&sl->gb, sps, sl->ref_count, | ret = ff_h264_pred_weight_table(&sl->gb, sps, sl->ref_count, | ||||
sl->slice_type_nos, &sl->pwt, h->avctx); | |||||
sl->slice_type_nos, &sl->pwt, | |||||
picture_structure, h->avctx); | |||||
if (ret < 0) | if (ret < 0) | ||||
return ret; | return ret; | ||||
} | } | ||||