Release reference to the new frame buffer on error
When we get a new frame buffer from get_free_fb(), we may temporarily
save that reference in a local variable. In that case, if the
aom_realloc_frame_buffer() call fails, we need to release that reference
before calling aom_internal_error(), otherwise the reference saved in
the local variable will be leaked.
BUG=oss-fuzz:10780
Change-Id: I8f2727a6b9e09eca8b819561305b9670ebac455e
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 9cb1cee..285e365 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -5067,6 +5067,7 @@
AOM_BORDER_IN_PIXELS, cm->byte_alignment,
&pool->frame_bufs[buf_idx].raw_frame_buffer, pool->get_fb_cb,
pool->cb_priv)) {
+ decrease_ref_count(buf_idx, frame_bufs, pool);
unlock_buffer_pool(pool);
aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
"Failed to allocate frame buffer");
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 43ddaf3..47f2a5e 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3754,9 +3754,14 @@
&new_fb_ptr->buf, cm->width, cm->height,
cm->seq_params.subsampling_x, cm->seq_params.subsampling_y,
cm->seq_params.use_highbitdepth, AOM_BORDER_IN_PIXELS,
- cm->byte_alignment, NULL, NULL, NULL))
+ cm->byte_alignment, NULL, NULL, NULL)) {
+ if (force_scaling) {
+ // Release the reference acquired in the get_free_fb() call above.
+ --new_fb_ptr->ref_count;
+ }
aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
"Failed to allocate frame buffer");
+ }
av1_resize_and_extend_frame(
ref, &new_fb_ptr->buf, (int)cm->seq_params.bit_depth, num_planes);
cpi->scaled_ref_idx[ref_frame - 1] = new_fb;