Fix crash of ObjC SDK sLD / sRD with incorrect SDP.
There are two problems with setLocalDescription / setRemoteDescription in ObjC SDK. First, RTCSessionDescription.nativeDescription returns a raw nullableSessionDescriptionInterface pointer, where sLD/sRD are calling Clone() method unconditionally, so it might crash. Second, unnecessary sLD/sRD calls Clone() of the raw pointer and does not delete it, so this pointer will leak. To solve these problems, I changed the return type of nativeDescription to std::unique_ptr and removed the call to Clone() method. Bug: webrtc:13022, webrtc:13035 Change-Id: Icbb87dda62d3a11af47ec74621cf64b8a6c05228 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/227380 Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Byoungchan Lee <daniel.l@hpcnt.com> Cr-Commit-Position: refs/heads/master@{#34647}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
31c0cfdf7f
commit
33728152ca
@ -23,11 +23,13 @@
|
||||
#import "api/peerconnection/RTCPeerConnection.h"
|
||||
#import "api/peerconnection/RTCPeerConnectionFactory+Native.h"
|
||||
#import "api/peerconnection/RTCPeerConnectionFactory.h"
|
||||
#import "api/peerconnection/RTCSessionDescription.h"
|
||||
#import "helpers/NSString+StdString.h"
|
||||
|
||||
@interface RTCPeerConnectionTest : NSObject
|
||||
- (void)testConfigurationGetter;
|
||||
- (void)testWithDependencies;
|
||||
- (void)testWithInvalidSDP;
|
||||
@end
|
||||
|
||||
@implementation RTCPeerConnectionTest
|
||||
@ -137,6 +139,35 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testWithInvalidSDP {
|
||||
RTC_OBJC_TYPE(RTCPeerConnectionFactory) *factory =
|
||||
[[RTC_OBJC_TYPE(RTCPeerConnectionFactory) alloc] init];
|
||||
|
||||
RTC_OBJC_TYPE(RTCConfiguration) *config = [[RTC_OBJC_TYPE(RTCConfiguration) alloc] init];
|
||||
RTC_OBJC_TYPE(RTCMediaConstraints) *contraints =
|
||||
[[RTC_OBJC_TYPE(RTCMediaConstraints) alloc] initWithMandatoryConstraints:@{}
|
||||
optionalConstraints:nil];
|
||||
RTC_OBJC_TYPE(RTCPeerConnection) *peerConnection =
|
||||
[factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
|
||||
|
||||
dispatch_semaphore_t negotiatedSem = dispatch_semaphore_create(0);
|
||||
[peerConnection setRemoteDescription:[[RTC_OBJC_TYPE(RTCSessionDescription) alloc]
|
||||
initWithType:RTCSdpTypeOffer
|
||||
sdp:@"invalid"]
|
||||
completionHandler:^(NSError *error) {
|
||||
ASSERT_NE(error, nil);
|
||||
if (error != nil) {
|
||||
dispatch_semaphore_signal(negotiatedSem);
|
||||
}
|
||||
}];
|
||||
|
||||
NSTimeInterval timeout = 5;
|
||||
ASSERT_EQ(
|
||||
0,
|
||||
dispatch_semaphore_wait(negotiatedSem,
|
||||
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC))));
|
||||
[peerConnection close];
|
||||
}
|
||||
@end
|
||||
|
||||
TEST(RTCPeerConnectionTest, ConfigurationGetterTest) {
|
||||
@ -152,3 +183,10 @@ TEST(RTCPeerConnectionTest, TestWithDependencies) {
|
||||
[test testWithDependencies];
|
||||
}
|
||||
}
|
||||
|
||||
TEST(RTCPeerConnectionTest, TestWithInvalidSDP) {
|
||||
@autoreleasepool {
|
||||
RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
|
||||
[test testWithInvalidSDP];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user