Add a missing NULL check before releasing a texture ref.
This causes a crash if the NV12 texture cache attempts to upload textures for a frame with a NULL backing CVPixelBufferRef. Bug: webrtc:10175 Change-Id: I6866dcde5ace745cbd95b762254294aa8406c2a5 Reviewed-on: https://webrtc-review.googlesource.com/c/115430 Commit-Queue: Chuck Hays <haysc@webrtc.org> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26140}
This commit is contained in:
parent
47e38b73bb
commit
fb4e9bc9a2
@ -1036,6 +1036,7 @@ if (is_ios || is_mac) {
|
||||
"objc/unittests/RTCCallbackLogger_xctest.m",
|
||||
"objc/unittests/RTCFileVideoCapturer_xctest.mm",
|
||||
"objc/unittests/RTCH264ProfileLevelId_xctest.m",
|
||||
"objc/unittests/RTCNV12TextureCache_xctest.m",
|
||||
"objc/unittests/RTCPeerConnectionFactory_xctest.m",
|
||||
"objc/unittests/frame_buffer_helpers.h",
|
||||
"objc/unittests/frame_buffer_helpers.mm",
|
||||
@ -1062,6 +1063,7 @@ if (is_ios || is_mac) {
|
||||
":native_api_audio_device_module",
|
||||
":native_video",
|
||||
":peerconnectionfactory_base_objc",
|
||||
":video_objc",
|
||||
":video_toolbox_cc",
|
||||
":videocapture_objc",
|
||||
":videocodec_objc",
|
||||
|
||||
@ -60,8 +60,10 @@
|
||||
kCFAllocatorDefault, _textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, pixelFormat, width,
|
||||
height, pixelFormat, GL_UNSIGNED_BYTE, planeIndex, textureOut);
|
||||
if (ret != kCVReturnSuccess) {
|
||||
CFRelease(*textureOut);
|
||||
*textureOut = nil;
|
||||
if (*textureOut) {
|
||||
CFRelease(*textureOut);
|
||||
*textureOut = nil;
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
NSAssert(CVOpenGLESTextureGetTarget(*textureOut) == GL_TEXTURE_2D,
|
||||
|
||||
53
sdk/objc/unittests/RTCNV12TextureCache_xctest.m
Normal file
53
sdk/objc/unittests/RTCNV12TextureCache_xctest.m
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#import <CoreVideo/CoreVideo.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <GLKit/GLKit.h>
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "base/RTCVideoFrame.h"
|
||||
#import "base/RTCVideoFrameBuffer.h"
|
||||
#import "components/renderer/opengl/RTCNV12TextureCache.h"
|
||||
#import "components/video_frame_buffer/RTCCVPixelBuffer.h"
|
||||
|
||||
@interface RTCNV12TextureCacheTests : XCTestCase
|
||||
@end
|
||||
|
||||
@implementation RTCNV12TextureCacheTests {
|
||||
EAGLContext *_glContext;
|
||||
RTCNV12TextureCache *_nv12TextureCache;
|
||||
}
|
||||
|
||||
- (void)setUp {
|
||||
[super setUp];
|
||||
_glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
|
||||
if (!_glContext) {
|
||||
_glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
|
||||
}
|
||||
_nv12TextureCache = [[RTCNV12TextureCache alloc] initWithContext:_glContext];
|
||||
}
|
||||
|
||||
- (void)tearDown {
|
||||
_nv12TextureCache = nil;
|
||||
_glContext = nil;
|
||||
[super tearDown];
|
||||
}
|
||||
|
||||
- (void)testNV12TextureCacheDoesNotCrashOnEmptyFrame {
|
||||
CVPixelBufferRef nullPixelBuffer = NULL;
|
||||
RTCCVPixelBuffer *badFrameBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:nullPixelBuffer];
|
||||
RTCVideoFrame *badFrame = [[RTCVideoFrame alloc] initWithBuffer:badFrameBuffer
|
||||
rotation:RTCVideoRotation_0
|
||||
timeStampNs:0];
|
||||
[_nv12TextureCache uploadFrameToTextures:badFrame];
|
||||
}
|
||||
|
||||
@end
|
||||
Loading…
x
Reference in New Issue
Block a user