From 3e871ea0474adc012cedf976626543c32b49ff49 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 2 Mar 2018 13:11:04 +0100 Subject: [PATCH] Single exit point in VPx wrapper Release(). This fixes potential memory leak caused by early exit in Release() methods. Bug: webrtc:8967 Change-Id: I932ec4a451d30b3145a6133a9562e73248a8c203 Reviewed-on: https://webrtc-review.googlesource.com/59380 Reviewed-by: Rasmus Brandt Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#22268} --- modules/video_coding/codecs/vp8/vp8_impl.cc | 6 ++++-- modules/video_coding/codecs/vp9/vp9_impl.cc | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/video_coding/codecs/vp8/vp8_impl.cc b/modules/video_coding/codecs/vp8/vp8_impl.cc index 94d8940097..f491445835 100644 --- a/modules/video_coding/codecs/vp8/vp8_impl.cc +++ b/modules/video_coding/codecs/vp8/vp8_impl.cc @@ -1291,16 +1291,18 @@ int VP8DecoderImpl::RegisterDecodeCompleteCallback( } int VP8DecoderImpl::Release() { + int ret_val = WEBRTC_VIDEO_CODEC_OK; + if (decoder_ != NULL) { if (vpx_codec_destroy(decoder_)) { - return WEBRTC_VIDEO_CODEC_MEMORY; + ret_val = WEBRTC_VIDEO_CODEC_MEMORY; } delete decoder_; decoder_ = NULL; } buffer_pool_.Release(); inited_ = false; - return WEBRTC_VIDEO_CODEC_OK; + return ret_val; } const char* VP8DecoderImpl::ImplementationName() const { diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc index 7a779deb37..c54fda53b7 100644 --- a/modules/video_coding/codecs/vp9/vp9_impl.cc +++ b/modules/video_coding/codecs/vp9/vp9_impl.cc @@ -94,13 +94,15 @@ VP9EncoderImpl::~VP9EncoderImpl() { } int VP9EncoderImpl::Release() { + int ret_val = WEBRTC_VIDEO_CODEC_OK; + if (encoded_image_._buffer != nullptr) { delete[] encoded_image_._buffer; encoded_image_._buffer = nullptr; } if (encoder_ != nullptr) { if (vpx_codec_destroy(encoder_)) { - return WEBRTC_VIDEO_CODEC_MEMORY; + ret_val = WEBRTC_VIDEO_CODEC_MEMORY; } delete encoder_; encoder_ = nullptr; @@ -114,7 +116,7 @@ int VP9EncoderImpl::Release() { raw_ = nullptr; } inited_ = false; - return WEBRTC_VIDEO_CODEC_OK; + return ret_val; } bool VP9EncoderImpl::ExplicitlyConfiguredSpatialLayers() const { @@ -1003,11 +1005,13 @@ int VP9DecoderImpl::RegisterDecodeCompleteCallback( } int VP9DecoderImpl::Release() { + int ret_val = WEBRTC_VIDEO_CODEC_OK; + if (decoder_ != nullptr) { // When a codec is destroyed libvpx will release any buffers of // |frame_buffer_pool_| it is currently using. if (vpx_codec_destroy(decoder_)) { - return WEBRTC_VIDEO_CODEC_MEMORY; + ret_val = WEBRTC_VIDEO_CODEC_MEMORY; } delete decoder_; decoder_ = nullptr; @@ -1017,7 +1021,7 @@ int VP9DecoderImpl::Release() { // to the pool. frame_buffer_pool_.ClearPool(); inited_ = false; - return WEBRTC_VIDEO_CODEC_OK; + return ret_val; } const char* VP9DecoderImpl::ImplementationName() const {