diff --git a/mpp/codec/dec/h265/h265d_ps.c b/mpp/codec/dec/h265/h265d_ps.c index 47f40d15..2f3236a9 100644 --- a/mpp/codec/dec/h265/h265d_ps.c +++ b/mpp/codec/dec/h265/h265d_ps.c @@ -1577,17 +1577,38 @@ RK_S32 mpp_hevc_decode_nal_sps(HEVCContext *s) h265d_dbg(H265D_DBG_SPS, "2 read bit left %d", gb->num_remaining_bits_in_curr_byte_ + gb->bytes_left_ * 8); READ_UE(gb, &sps->log2_min_cb_size) ; + if (sps->log2_min_cb_size > (LOG2_MAX_CU_SIZE - 3)) { + mpp_err( "Invalid value for log2_min_cb_size"); + ret = MPP_ERR_STREAM; + goto err; + } sps->log2_min_cb_size += 3; h265d_dbg(H265D_DBG_SPS, "sps->log2_min_cb_size %d", sps->log2_min_cb_size); READ_UE(gb, &sps->log2_diff_max_min_coding_block_size); + if (sps->log2_diff_max_min_coding_block_size > (LOG2_MAX_CU_SIZE - LOG2_MIN_CU_SIZE)) { + mpp_err( "Invalid value for log2_diff_max_min_coding_block_size"); + ret = MPP_ERR_STREAM; + goto err; + } h265d_dbg(H265D_DBG_SPS, "sps->log2_diff_max_min_coding_block_size %d", sps->log2_diff_max_min_coding_block_size); READ_UE(gb, &sps->log2_min_tb_size); + if (sps->log2_min_tb_size > (LOG2_MAX_TU_SIZE - 2)) { + mpp_err( "Invalid value for log2_min_tb_size"); + ret = MPP_ERR_STREAM; + goto err; + } sps->log2_min_tb_size += 2; h265d_dbg(H265D_DBG_SPS, "sps->log2_min_tb_size %d", sps->log2_min_tb_size); READ_UE(gb, &log2_diff_max_min_transform_block_size); + if (log2_diff_max_min_transform_block_size > (LOG2_MAX_TU_SIZE - LOG2_MIN_TU_SIZE)) { + mpp_err( "Invalid value for log2_diff_max_min_transform_block_size"); + ret = MPP_ERR_STREAM; + goto err; + } + h265d_dbg(H265D_DBG_SPS, "sps->log2_diff_max_min_transform_block_size %d", log2_diff_max_min_transform_block_size); sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size + diff --git a/mpp/common/h265_syntax.h b/mpp/common/h265_syntax.h index fa4c31ac..34475e34 100644 --- a/mpp/common/h265_syntax.h +++ b/mpp/common/h265_syntax.h @@ -110,6 +110,14 @@ #define MPP_PROFILE_HEVC_MAIN_10 2 #define MPP_PROFILE_HEVC_MAIN_STILL_PICTURE 3 +#define LOG2_MAX_CTB_SIZE 6 +#define LOG2_MIN_CTB_SIZE 4 +#define LOG2_MAX_PU_SIZE 6 +#define LOG2_MIN_PU_SIZE 2 +#define LOG2_MAX_TU_SIZE 5 +#define LOG2_MIN_TU_SIZE 2 +#define LOG2_MAX_CU_SIZE 6 +#define LOG2_MIN_CU_SIZE 3 /** * Value of the luma sample at position (x, y) in the 2D array tab.