From c499a22be44526cdcb8ff889a6158b08d5019cf1 Mon Sep 17 00:00:00 2001 From: jinboli <jinbo.li@savoirfairelinux.com> Date: Thu, 22 Nov 2018 15:30:33 -0500 Subject: [PATCH] encoder: add error checking to videoFrameSize av_image_get_buffer_size can return a negative error code. Prevents casting such an error to a large positive integer that may cause a bad_alloc exception on the subsequent buffer allocation. Change-Id: Ie8a7987dcf16957a21496e791c34957bb2e35bfc --- src/media/media_buffer.cpp | 2 +- src/media/media_buffer.h | 2 +- src/media/media_encoder.cpp | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/media/media_buffer.cpp b/src/media/media_buffer.cpp index cece1a7c4f..6acf2c2c61 100644 --- a/src/media/media_buffer.cpp +++ b/src/media/media_buffer.cpp @@ -34,7 +34,7 @@ namespace ring { //=== HELPERS ================================================================== -std::size_t +int videoFrameSize(int format, int width, int height) { return av_image_get_buffer_size((AVPixelFormat)format, width, height, 1); diff --git a/src/media/media_buffer.h b/src/media/media_buffer.h index 5bb8616f48..855467f76e 100644 --- a/src/media/media_buffer.h +++ b/src/media/media_buffer.h @@ -42,7 +42,7 @@ using AudioFrame = DRing::AudioFrame; using VideoFrame = DRing::VideoFrame; // Some helpers -std::size_t videoFrameSize(int format, int width, int height); +int videoFrameSize(int format, int width, int height); #endif // RING_VIDEO diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 7e59f3dd2b..80f97f5b07 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -286,7 +286,9 @@ MediaEncoder::addStream(const SystemCodecInfo& systemCodecInfo, std::string para const int height = encoderCtx->height; const int format = encoderCtx->pix_fmt; scaledFrameBufferSize_ = videoFrameSize(format, width, height); - if (scaledFrameBufferSize_ <= AV_INPUT_BUFFER_MIN_SIZE) + if (scaledFrameBufferSize_ < 0) + throw MediaEncoderException(("Could not compute buffer size: " + libav_utils::getError(scaledFrameBufferSize_)).c_str()); + else if (scaledFrameBufferSize_ <= AV_INPUT_BUFFER_MIN_SIZE) throw MediaEncoderException("buffer too small"); scaledFrameBuffer_.reserve(scaledFrameBufferSize_); -- GitLab