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 <jakebromberg@google.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34607}
diff --git a/sdk/objc/api/peerconnection/RTCSessionDescription.h b/sdk/objc/api/peerconnection/RTCSessionDescription.h
index 8a9479d..0ef60cc 100644
--- a/sdk/objc/api/peerconnection/RTCSessionDescription.h
+++ b/sdk/objc/api/peerconnection/RTCSessionDescription.h
@@ -36,8 +36,10 @@
 
 - (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 9fd97fe..3e235b1 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 ee65649..1f8a75d 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, InvalidSessionDescriptionConversionTest) {
+  @autoreleasepool {
+    RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];
+    [test testInvalidSessionDescriptionConversion];
+  }
+}
+
 TEST(RTCSessionDescriptionTest, InitFromSessionDescriptionTest) {
   @autoreleasepool {
     RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];