Fixed bit stream access to make sure that it is not read beyond the allocated size.
Bug: 25765591
Change-Id: I98c23a3c3f84f6710f29bffe5ed73adcf51d47f6
diff --git a/decoder/impeg2d_bitstream.c b/decoder/impeg2d_bitstream.c
index 92d3785..b67161d 100644
--- a/decoder/impeg2d_bitstream.c
+++ b/decoder/impeg2d_bitstream.c
@@ -164,9 +164,12 @@
if (u4_curr_bit == 31)
{
ps_stream->u4_buf = ps_stream->u4_buf_nxt;
- u4_temp = *(ps_stream->pu4_buf_aligned)++;
- CONV_LE_TO_BE(ps_stream->u4_buf_nxt,u4_temp)
+ if (ps_stream->u4_offset < ps_stream->u4_max_offset)
+ {
+ u4_temp = *(ps_stream->pu4_buf_aligned)++;
+ CONV_LE_TO_BE(ps_stream->u4_buf_nxt,u4_temp)
+ }
}
ps_stream->u4_offset = u4_offset;
@@ -189,7 +192,11 @@
{
stream_t *ps_stream = (stream_t *)pv_ctxt;
- FLUSH_BITS(ps_stream->u4_offset,ps_stream->u4_buf,ps_stream->u4_buf_nxt,u4_no_of_bits,ps_stream->pu4_buf_aligned)
+
+ if (ps_stream->u4_offset < ps_stream->u4_max_offset)
+ {
+ FLUSH_BITS(ps_stream->u4_offset,ps_stream->u4_buf,ps_stream->u4_buf_nxt,u4_no_of_bits,ps_stream->pu4_buf_aligned)
+ }
return;
}
/******************************************************************************
diff --git a/decoder/impeg2d_d_pic.c b/decoder/impeg2d_d_pic.c
index 6fcf1f4..23c393f 100644
--- a/decoder/impeg2d_d_pic.c
+++ b/decoder/impeg2d_d_pic.c
@@ -172,7 +172,8 @@
/*------------------------------------------------------------------*/
/* Discard the Macroblock stuffing in case of MPEG-1 stream */
/*------------------------------------------------------------------*/
- while(impeg2d_bit_stream_nxt(ps_stream,MB_STUFFING_CODE_LEN) == MB_STUFFING_CODE)
+ while(impeg2d_bit_stream_nxt(ps_stream,MB_STUFFING_CODE_LEN) == MB_STUFFING_CODE &&
+ ps_stream->u4_offset < ps_stream->u4_max_offset)
impeg2d_bit_stream_flush(ps_stream,MB_STUFFING_CODE_LEN);
/*------------------------------------------------------------------*/
diff --git a/decoder/impeg2d_dec_hdr.c b/decoder/impeg2d_dec_hdr.c
index 061bf04..83c1545 100644
--- a/decoder/impeg2d_dec_hdr.c
+++ b/decoder/impeg2d_dec_hdr.c
@@ -82,8 +82,8 @@
ps_stream = &ps_dec->s_bit_stream;
impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
- while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != u4_start_code_val)
- && (ps_dec->s_bit_stream.u4_offset <= ps_dec->s_bit_stream.u4_max_offset))
+ while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != u4_start_code_val) &&
+ (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
{
if (impeg2d_bit_stream_get(ps_stream,8) != 0)
@@ -111,7 +111,7 @@
impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
- && (ps_dec->s_bit_stream.u4_offset <= ps_dec->s_bit_stream.u4_max_offset))
+ && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
{
impeg2d_bit_stream_get(ps_stream,8);
}
@@ -669,7 +669,8 @@
/* } */
/* extra_bit_picture 1 */
/*-----------------------------------------------------------------------*/
- while (impeg2d_bit_stream_nxt(ps_stream,1) == 1)
+ while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
+ ps_stream->u4_offset < ps_stream->u4_max_offset)
{
impeg2d_bit_stream_get(ps_stream,9);
}
@@ -800,7 +801,8 @@
{
impeg2d_bit_stream_flush(ps_stream,9);
/* Flush extra bit information */
- while (impeg2d_bit_stream_nxt(ps_stream,1) == 1)
+ while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
+ ps_stream->u4_offset < ps_stream->u4_max_offset)
{
impeg2d_bit_stream_flush(ps_stream,9);
}
@@ -1322,10 +1324,12 @@
ps_stream = &ps_dec->s_bit_stream;
u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
- while(u4_start_code == EXTENSION_START_CODE || u4_start_code == USER_DATA_START_CODE)
+ while((u4_start_code == EXTENSION_START_CODE || u4_start_code == USER_DATA_START_CODE) &&
+ (ps_stream->u4_offset < ps_stream->u4_max_offset))
{
impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
- while(impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
+ while(impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX &&
+ (ps_stream->u4_offset < ps_stream->u4_max_offset))
{
impeg2d_bit_stream_flush(ps_stream,8);
}
@@ -1354,7 +1358,8 @@
while(u4_start_code == USER_DATA_START_CODE)
{
impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
- while(impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
+ while((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX) &&
+ (ps_stream->u4_offset < ps_stream->u4_max_offset))
{
impeg2d_bit_stream_flush(ps_stream,8);
}
@@ -1384,7 +1389,8 @@
u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
while( (u4_start_code == EXTENSION_START_CODE ||
u4_start_code == USER_DATA_START_CODE) &&
- (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error)
+ (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
+ (ps_stream->u4_offset < ps_stream->u4_max_offset))
{
if(u4_start_code == USER_DATA_START_CODE)
{
@@ -1436,7 +1442,8 @@
u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
while ( (u4_start_code == EXTENSION_START_CODE ||
u4_start_code == USER_DATA_START_CODE) &&
- (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error)
+ (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
+ (ps_stream->u4_offset < ps_stream->u4_max_offset))
{
if(u4_start_code == USER_DATA_START_CODE)
{
diff --git a/decoder/impeg2d_pic_proc.c b/decoder/impeg2d_pic_proc.c
index e79e87a..b4f88be 100644
--- a/decoder/impeg2d_pic_proc.c
+++ b/decoder/impeg2d_pic_proc.c
@@ -219,7 +219,8 @@
UWORD16 impeg2d_get_mb_addr_incr(stream_t *ps_stream)
{
UWORD16 u2_mb_addr_incr = 0;
- while (impeg2d_bit_stream_nxt(ps_stream,MB_ESCAPE_CODE_LEN) == MB_ESCAPE_CODE)
+ while (impeg2d_bit_stream_nxt(ps_stream,MB_ESCAPE_CODE_LEN) == MB_ESCAPE_CODE &&
+ ps_stream->u4_offset < ps_stream->u4_max_offset)
{
impeg2d_bit_stream_flush(ps_stream,MB_ESCAPE_CODE_LEN);
u2_mb_addr_incr += 33;