AnimEncoder: avoid freeing uninitialized memory pointer.

In GenerateCandidates(), when candidate_ll->evaluate_ and
candidate_lossy->evaluate_ are both true, if lossless encoding
exits on error, candidate_ll->evaluate_ would not be correctly
reset. This will cause freeing uninitialized memory pointer in
SetFrame().

BUG=webp:322

Change-Id: I481b49a186e4fa3607ce71b4543a481083edf444
This commit is contained in:
hui su 2016-12-13 17:32:06 -08:00
parent 58fc507842
commit 3ebe1c0003

View File

@ -863,8 +863,8 @@ static WebPEncodingError GenerateCandidates(
WebPPicture* const curr_canvas = &enc->curr_canvas_copy_; WebPPicture* const curr_canvas = &enc->curr_canvas_copy_;
const WebPPicture* const prev_canvas = const WebPPicture* const prev_canvas =
is_dispose_none ? &enc->prev_canvas_ : &enc->prev_canvas_disposed_; is_dispose_none ? &enc->prev_canvas_ : &enc->prev_canvas_disposed_;
int use_blending_ll; int use_blending_ll, use_blending_lossy;
int use_blending_lossy; int evaluate_ll, evaluate_lossy;
CopyCurrentCanvas(enc); CopyCurrentCanvas(enc);
use_blending_ll = use_blending_ll =
@ -877,19 +877,19 @@ static WebPEncodingError GenerateCandidates(
// Pick candidates to be tried. // Pick candidates to be tried.
if (!enc->options_.allow_mixed) { if (!enc->options_.allow_mixed) {
candidate_ll->evaluate_ = is_lossless; evaluate_ll = is_lossless;
candidate_lossy->evaluate_ = !is_lossless; evaluate_lossy = !is_lossless;
} else if (enc->options_.minimize_size) { } else if (enc->options_.minimize_size) {
candidate_ll->evaluate_ = 1; evaluate_ll = 1;
candidate_lossy->evaluate_ = 1; evaluate_lossy = 1;
} else { // Use a heuristic for trying lossless and/or lossy compression. } else { // Use a heuristic for trying lossless and/or lossy compression.
const int num_colors = WebPGetColorPalette(&params->sub_frame_ll_, NULL); const int num_colors = WebPGetColorPalette(&params->sub_frame_ll_, NULL);
candidate_ll->evaluate_ = (num_colors < MAX_COLORS_LOSSLESS); evaluate_ll = (num_colors < MAX_COLORS_LOSSLESS);
candidate_lossy->evaluate_ = (num_colors >= MIN_COLORS_LOSSY); evaluate_lossy = (num_colors >= MIN_COLORS_LOSSY);
} }
// Generate candidates. // Generate candidates.
if (candidate_ll->evaluate_) { if (evaluate_ll) {
CopyCurrentCanvas(enc); CopyCurrentCanvas(enc);
if (use_blending_ll) { if (use_blending_ll) {
enc->curr_canvas_copy_modified_ = enc->curr_canvas_copy_modified_ =
@ -899,7 +899,7 @@ static WebPEncodingError GenerateCandidates(
config_ll, use_blending_ll, candidate_ll); config_ll, use_blending_ll, candidate_ll);
if (error_code != VP8_ENC_OK) return error_code; if (error_code != VP8_ENC_OK) return error_code;
} }
if (candidate_lossy->evaluate_) { if (evaluate_lossy) {
CopyCurrentCanvas(enc); CopyCurrentCanvas(enc);
if (use_blending_lossy) { if (use_blending_lossy) {
enc->curr_canvas_copy_modified_ = enc->curr_canvas_copy_modified_ =
@ -1105,9 +1105,7 @@ static WebPEncodingError SetFrame(WebPAnimEncoder* const enc,
return VP8_ENC_ERROR_INVALID_CONFIGURATION; return VP8_ENC_ERROR_INVALID_CONFIGURATION;
} }
for (i = 0; i < CANDIDATE_COUNT; ++i) { memset(candidates, 0, sizeof(candidates));
candidates[i].evaluate_ = 0;
}
// Change-rectangle assuming previous frame was DISPOSE_NONE. // Change-rectangle assuming previous frame was DISPOSE_NONE.
if (!GetSubRects(prev_canvas, curr_canvas, is_key_frame, is_first_frame, if (!GetSubRects(prev_canvas, curr_canvas, is_key_frame, is_first_frame,