summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Zemtsov <eugene@chromium.org>2022-04-08 23:28:35 +0000
committerMichael BrĂ¼ning <michael.bruning@qt.io>2022-05-24 13:44:43 +0000
commit67fc041e76d301756c16858e97ba11db797bd68d (patch)
tree8c6e05b26dbfebc1097bc0cf05191d0759ef8380
parentbd6141bd6d1cdbfc535ccd62702446877865869f (diff)
downloadqtwebengine-chromium-67fc041e76d301756c16858e97ba11db797bd68d.tar.gz
[Backport] Security bug 1312563
Manual cherry-pick of patch originally reviewed on https://chromium-review.googlesource.com/c/chromium/src/+/3575680: Only destroy successfully created compression session in VT encoder This is a defensive change, since we don't have a repro on hand. My guess is that VTCompressionSessionCreate() might fail to create a compression session, but still write a value to compressionSessionOut. It makes VTCompressionSessionInvalidate() access uninitialized memory. That's why this CL makes sure that we only destroy a compression session if VTCompressionSessionCreate() reports success. Bug: 1312563 Change-Id: I468ce0e10bad251ca0b62b568607dbc5c32ba8bc Reviewed-by: Dale Curtis <dalecurtis@chromium.org> Commit-Queue: Eugene Zemtsov <eugene@chromium.org> Cr-Commit-Position: refs/heads/main@{#990654} Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc12
1 files changed, 8 insertions, 4 deletions
diff --git a/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc
index 5b7a020573d..7e058e9670e 100644
--- a/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc
+++ b/chromium/media/gpu/mac/vt_video_encode_accelerator_mac.cc
@@ -119,13 +119,13 @@ VTVideoEncodeAccelerator::GetSupportedProfiles() {
SupportedProfiles profiles;
const bool rv = CreateCompressionSession(
gfx::Size(kDefaultResolutionWidth, kDefaultResolutionHeight));
- DestroyCompressionSession();
if (!rv) {
VLOG(1)
<< "Hardware encode acceleration is not available on this platform.";
return profiles;
}
+ DestroyCompressionSession();
SupportedProfile profile;
profile.max_framerate_numerator = kMaxFrameRateNumerator;
profile.max_framerate_denominator = kMaxFrameRateDenominator;
@@ -495,10 +495,8 @@ bool VTVideoEncodeAccelerator::ResetCompressionSession() {
DestroyCompressionSession();
bool session_rv = CreateCompressionSession(input_visible_size_);
- if (!session_rv) {
- DestroyCompressionSession();
+ if (!session_rv)
return false;
- }
const bool configure_rv = ConfigureCompressionSession();
if (configure_rv)
@@ -534,6 +532,12 @@ bool VTVideoEncodeAccelerator::CreateCompressionSession(
&VTVideoEncodeAccelerator::CompressionCallback,
reinterpret_cast<void*>(this), compression_session_.InitializeInto());
if (status != noErr) {
+ // IMPORTANT: ScopedCFTypeRef::release() doesn't call CFRelease().
+ // In case of an error VTCompressionSessionCreate() is not supposed to
+ // write a non-null value into compression_session_, but just in case,
+ // we'll clear it without calling CFRelease() because it can be unsafe
+ // to call on a not fully created session.
+ (void)compression_session_.release();
DLOG(ERROR) << " VTCompressionSessionCreate failed: " << status;
return false;
}