From 48cd9dbc5067f266b07541d2eebfb4b88fe455d4 Mon Sep 17 00:00:00 2001 From: Jake Bromberg Date: Fri, 30 Jul 2021 10:12:07 -0700 Subject: [PATCH] An RTCSessionDescription will now return nil from its initializer if the SDP passed to it is invalid. Bug: webrtc:13022 Change-Id: I2f2ad96884cf2f43f5ea95c1210470dd6aa5c919 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/226980 Commit-Queue: Jake Bromberg Reviewed-by: Harald Alvestrand Cr-Commit-Position: refs/heads/master@{#34607} --- .../peerconnection/RTCSessionDescription.h | 6 ++- .../peerconnection/RTCSessionDescription.mm | 45 ++++++++++--------- .../unittests/RTCSessionDescriptionTest.mm | 14 ++++++ 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/sdk/objc/api/peerconnection/RTCSessionDescription.h b/sdk/objc/api/peerconnection/RTCSessionDescription.h index 8a9479d5cf..0ef60cc38d 100644 --- a/sdk/objc/api/peerconnection/RTCSessionDescription.h +++ b/sdk/objc/api/peerconnection/RTCSessionDescription.h @@ -36,8 +36,10 @@ RTC_OBJC_EXPORT - (instancetype)init NS_UNAVAILABLE; -/** Initialize a session description with a type and SDP string. */ -- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp NS_DESIGNATED_INITIALIZER; +/** Initialize a session description with a type and SDP string. Returns nil if the sdp is invalid. + */ +- (nullable instancetype)initWithType:(RTCSdpType)type + sdp:(NSString *)sdp NS_DESIGNATED_INITIALIZER; + (NSString *)stringForType:(RTCSdpType)type; diff --git a/sdk/objc/api/peerconnection/RTCSessionDescription.mm b/sdk/objc/api/peerconnection/RTCSessionDescription.mm index 9fd97fee23..3e235b1985 100644 --- a/sdk/objc/api/peerconnection/RTCSessionDescription.mm +++ b/sdk/objc/api/peerconnection/RTCSessionDescription.mm @@ -17,23 +17,45 @@ @implementation RTC_OBJC_TYPE (RTCSessionDescription) +@synthesize nativeDescription = _nativeDescription; @synthesize type = _type; @synthesize sdp = _sdp; + (NSString *)stringForType:(RTCSdpType)type { - std::string string = [[self class] stdStringForType:type]; + std::string string = [self stdStringForType:type]; return [NSString stringForStdString:string]; } + (RTCSdpType)typeForString:(NSString *)string { std::string typeString = string.stdString; - return [[self class] typeForStdString:typeString]; + return [self typeForStdString:typeString]; } -- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { ++ (webrtc::SessionDescriptionInterface *)nativeDescriptionForString:(NSString *)sdp + type:(RTCSdpType)type { + webrtc::SdpParseError error; + + webrtc::SessionDescriptionInterface *description = + webrtc::CreateSessionDescription([self stdStringForType:type], sdp.stdString, &error); + + if (!description) { + RTCLogError(@"Failed to create session description: %s\nline: %s", + error.description.c_str(), + error.line.c_str()); + } + + return description; +} + +- (nullable instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp { if (self = [super init]) { _type = type; _sdp = [sdp copy]; + _nativeDescription = [[self class] nativeDescriptionForString:_sdp type:_type]; + + if (_nativeDescription == nil) { + return nil; + } } return self; } @@ -46,23 +68,6 @@ #pragma mark - Private -- (webrtc::SessionDescriptionInterface *)nativeDescription { - webrtc::SdpParseError error; - - webrtc::SessionDescriptionInterface *description = - webrtc::CreateSessionDescription([[self class] stdStringForType:_type], - _sdp.stdString, - &error); - - if (!description) { - RTCLogError(@"Failed to create session description: %s\nline: %s", - error.description.c_str(), - error.line.c_str()); - } - - return description; -} - - (instancetype)initWithNativeDescription: (const webrtc::SessionDescriptionInterface *)nativeDescription { NSParameterAssert(nativeDescription); diff --git a/sdk/objc/unittests/RTCSessionDescriptionTest.mm b/sdk/objc/unittests/RTCSessionDescriptionTest.mm index ee65649cbc..1f8a75d16f 100644 --- a/sdk/objc/unittests/RTCSessionDescriptionTest.mm +++ b/sdk/objc/unittests/RTCSessionDescriptionTest.mm @@ -42,6 +42,13 @@ EXPECT_EQ([self sdp].stdString, sdp); } +- (void)testInvalidSessionDescriptionConversion { + RTC_OBJC_TYPE(RTCSessionDescription) *description = + [[RTC_OBJC_TYPE(RTCSessionDescription) alloc] initWithType:RTCSdpTypeAnswer sdp:@"invalid"]; + + EXPECT_EQ(nil, description); +} + - (void)testInitFromNativeSessionDescription { webrtc::SessionDescriptionInterface *nativeDescription; @@ -135,6 +142,13 @@ TEST(RTCSessionDescriptionTest, SessionDescriptionConversionTest) { } } +TEST(RTCSessionDescriptionTest, InvalidSessionDescriptionConversionTest) { + @autoreleasepool { + RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init]; + [test testInvalidSessionDescriptionConversion]; + } +} + TEST(RTCSessionDescriptionTest, InitFromSessionDescriptionTest) { @autoreleasepool { RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];