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}
This commit is contained in:
Jake Bromberg 2021-07-30 10:12:07 -07:00 committed by WebRTC LUCI CQ
parent f36492e452
commit 48cd9dbc50
3 changed files with 43 additions and 22 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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];