[FFmpeg-trac] #4587(avcodec:new): ouf-of-boundry memory access in cabac(H264)
FFmpeg
trac at avcodec.org
Fri Jun 5 05:37:32 CEST 2015
#4587: ouf-of-boundry memory access in cabac(H264)
-------------------------------------+-----------------------------------
Reporter: rakexue | Owner:
Type: defect | Status: new
Priority: important | Component: avcodec
Version: unspecified | Resolution:
Keywords: H264 crash | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-----------------------------------
Comment (by rakexue):
Then close
{{{
#define get_cabac_inline get_cabac_inline_arm
}}}
to use plain C
{{{
static void refill2(CABACContext *c){
int i, x;
x= c->low ^ (c->low-1);
i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)];
x= -CABAC_MASK;
#if CABAC_BITS == 16
x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
#else
x+= c->bytestream[0]<<1;
#endif
c->low += x<<i;
if (c->bytestream >= c->bytestream_end)
av_log(NULL, AV_LOG_ERROR, "c->bytestream = %x, c->bytestream_end =
%x \n", c->bytestream, c->bytestream_end);
#if !UNCHECKED_BITSTREAM_READER
if (c->bytestream < c->bytestream_end)
#endif
c->bytestream += CABAC_BITS/8;
}
static av_always_inline int get_cabac_inline(CABACContext *c, uint8_t *
const state){
int s = *state;
int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
int bit, lps_mask;
c->range -= RangeLPS;
lps_mask= ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
c->range += (RangeLPS - c->range) & lps_mask;
s^=lps_mask;
*state= (ff_h264_mlps_state+128)[s];
bit= s&1;
lps_mask= ff_h264_norm_shift[c->range];
c->range<<= lps_mask;
c->low <<= lps_mask;
if(!(c->low & CABAC_MASK))
refill2(c);
return bit;
}
#endif
}}}
and some logs:
{{{
if (c->bytestream >= c->bytestream_end)
av_log(NULL, AV_LOG_ERROR, "c->bytestream = %x, c->bytestream_end =
%x \n", c->bytestream, c->bytestream_end);
}}}
get the following output:
{{{
06-05 11:30:46.490: I/fromffmpeg(7229): c->bytestream = 5c0ad51f,
c->bytestream_end = 5c0ad51f
06-05 11:30:47.004: I/fromffmpeg(7229): c->bytestream = 5cdb754a,
c->bytestream_end = 5cdb754a
06-05 11:30:47.830: I/fromffmpeg(7229): c->bytestream = 5c3be7cb,
c->bytestream_end = 5c3be7cb
06-05 11:30:48.170: I/fromffmpeg(7229): c->bytestream = 5cdb7ab5,
c->bytestream_end = 5cdb7ab5
06-05 11:30:48.460: I/fromffmpeg(7229): c->bytestream = 5c0ad02d,
c->bytestream_end = 5c0ad02d
06-05 11:30:48.674: I/fromffmpeg(7229): c->bytestream = 5c420337,
c->bytestream_end = 5c420337
06-05 11:30:49.404: I/fromffmpeg(7229): c->bytestream = 5c0ad104,
c->bytestream_end = 5c0ad104
06-05 11:30:49.567: I/fromffmpeg(7229): c->bytestream = 5c3be106,
c->bytestream_end = 5c3be106
06-05 11:30:50.537: I/fromffmpeg(7229): c->bytestream = 5c420482,
c->bytestream_end = 5c420482
06-05 11:30:50.647: I/fromffmpeg(7229): c->bytestream = 5c3be35e,
c->bytestream_end = 5c3be35e
06-05 11:30:50.710: I/fromffmpeg(7229): c->bytestream = 5cdb7481,
c->bytestream_end = 5cdb7481
06-05 11:30:51.217: I/fromffmpeg(7229): c->bytestream = 5c4202a3,
c->bytestream_end = 5c4202a3
06-05 11:30:51.804: I/fromffmpeg(7229): c->bytestream = 5c0ad331,
c->bytestream_end = 5c0ad331
06-05 11:30:52.517: I/fromffmpeg(7229): c->bytestream = 5c3be272,
c->bytestream_end = 5c3be272
06-05 11:30:52.610: I/fromffmpeg(7229): c->bytestream = 5c0ad2b8,
c->bytestream_end = 5c0ad2b8
06-05 11:30:52.807: I/fromffmpeg(7229): c->bytestream = 5c420052,
c->bytestream_end = 5c420052
06-05 11:30:52.884: I/fromffmpeg(7229): c->bytestream = 5c0ad7ae,
c->bytestream_end = 5c0ad7ae
06-05 11:30:52.974: I/fromffmpeg(7229): c->bytestream = 5cdb7048,
c->bytestream_end = 5cdb7048
06-05 11:30:53.180: I/fromffmpeg(7229): c->bytestream = 5c3be3f8,
c->bytestream_end = 5c3be3f8
06-05 11:30:53.944: I/fromffmpeg(7229): c->bytestream = 5c0ad088,
c->bytestream_end = 5c0ad088
06-05 11:30:54.087: I/fromffmpeg(7229): c->bytestream = 5c0ad192,
c->bytestream_end = 5c0ad192
06-05 11:30:54.277: I/fromffmpeg(7229): c->bytestream = 5c4200b0,
c->bytestream_end = 5c4200b0
06-05 11:30:54.650: I/fromffmpeg(7229): c->bytestream = 5c3be8cf,
c->bytestream_end = 5c3be8cf
06-05 11:30:54.687: I/fromffmpeg(7229): c->bytestream = 5c42034e,
c->bytestream_end = 5c42034e
06-05 11:30:59.490: I/fromffmpeg(7229): c->bytestream = 5c42004d,
c->bytestream_end = 5c42004d
06-05 11:31:00.397: I/fromffmpeg(7229): c->bytestream = 5c3be068,
c->bytestream_end = 5c3be068
06-05 11:31:00.674: I/fromffmpeg(7229): c->bytestream = 5c3be705,
c->bytestream_end = 5c3be705
06-05 11:31:01.301: I/fromffmpeg(7229): c->bytestream = 5c0ad2fe,
c->bytestream_end = 5c0ad2fe
06-05 11:31:01.331: I/fromffmpeg(7229): c->bytestream = 5c3be76b,
c->bytestream_end = 5c3be76b
06-05 11:31:01.607: I/fromffmpeg(7229): c->bytestream = 5c3be8c2,
c->bytestream_end = 5c3be8c2
}}}
It shows that refill2 accesses c->bytestream_end[0] and
c->bytestream_end[1].
--
Ticket URL: <https://trac.ffmpeg.org/ticket/4587#comment:3>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list