summaryrefslogtreecommitdiff
path: root/vp9
diff options
context:
space:
mode:
authorAlexander Voronov <avoronov@graphics.cs.msu.ru>2014-12-11 20:44:19 +0300
committerAlexander Voronov <avoronov@graphics.cs.msu.ru>2014-12-11 20:44:19 +0300
commit6c6a97814ff5b7707fadaccc445615f91a07ebf7 (patch)
treeab9b29d6a09de52c982c4e84492958bd99428f98 /vp9
parent26a0721268cfbb921f8b2320ccecab2c3d8982f2 (diff)
downloadlibvpx-6c6a97814ff5b7707fadaccc445615f91a07ebf7.tar
libvpx-6c6a97814ff5b7707fadaccc445615f91a07ebf7.tar.gz
libvpx-6c6a97814ff5b7707fadaccc445615f91a07ebf7.tar.bz2
libvpx-6c6a97814ff5b7707fadaccc445615f91a07ebf7.zip
Prevent decoder from using uninitialized entropy context.
If decoding starts with intra-only frame, there is a possibility of using uninitialized entropy context, what leads to undefined behavior. Change-Id: Icbb64b5b1bd1e5de2a4bfa2884e56bc0a20840af
Diffstat (limited to 'vp9')
-rw-r--r--vp9/common/vp9_entropymode.c1
-rw-r--r--vp9/common/vp9_entropymode.h1
-rw-r--r--vp9/decoder/vp9_decodeframe.c4
3 files changed, 6 insertions, 0 deletions
diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c
index d7610ed28..0edc4f9ba 100644
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -453,6 +453,7 @@ void vp9_setup_past_independence(VP9_COMMON *cm) {
vp9_default_coef_probs(cm);
vp9_init_mode_probs(cm->fc);
vp9_init_mv_probs(cm);
+ cm->fc->initialized = 1;
if (cm->frame_type == KEY_FRAME ||
cm->error_resilient_mode || cm->reset_frame_context == 3) {
diff --git a/vp9/common/vp9_entropymode.h b/vp9/common/vp9_entropymode.h
index 6831d3f87..6db10806d 100644
--- a/vp9/common/vp9_entropymode.h
+++ b/vp9/common/vp9_entropymode.h
@@ -50,6 +50,7 @@ typedef struct frame_contexts {
struct tx_probs tx_probs;
vp9_prob skip_probs[SKIP_CONTEXTS];
nmv_context nmvc;
+ int initialized;
} FRAME_CONTEXT;
typedef struct {
diff --git a/vp9/decoder/vp9_decodeframe.c b/vp9/decoder/vp9_decodeframe.c
index 2c5fbacb9..470b2bae8 100644
--- a/vp9/decoder/vp9_decodeframe.c
+++ b/vp9/decoder/vp9_decodeframe.c
@@ -1558,6 +1558,10 @@ void vp9_decode_frame(VP9Decoder *pbi,
vp9_setup_block_planes(xd, cm->subsampling_x, cm->subsampling_y);
*cm->fc = cm->frame_contexts[cm->frame_context_idx];
+ if (!cm->fc->initialized)
+ vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
+ "Uninitialized entropy context.");
+
vp9_zero(cm->counts);
vp9_zero(xd->dqcoeff);