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:
Byoungchan Lee
2021-08-04 20:54:45 +09:00
committed by WebRTC LUCI CQ
parent 31c0cfdf7f
commit 33728152ca
5 changed files with 46 additions and 9 deletions

View File

@ -581,7 +581,7 @@ void PeerConnectionDelegateAdapter::OnRemoveTrack(
RTC_DCHECK(completionHandler != nil);
rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface> observer(
new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler));
_peerConnection->SetLocalDescription(sdp.nativeDescription->Clone(), observer);
_peerConnection->SetLocalDescription(sdp.nativeDescription, observer);
}
- (void)setLocalDescriptionWithCompletionHandler:
@ -597,7 +597,7 @@ void PeerConnectionDelegateAdapter::OnRemoveTrack(
RTC_DCHECK(completionHandler != nil);
rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface> observer(
new rtc::RefCountedObject<::SetSessionDescriptionObserver>(completionHandler));
_peerConnection->SetRemoteDescription(sdp.nativeDescription->Clone(), observer);
_peerConnection->SetRemoteDescription(sdp.nativeDescription, observer);
}
- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps

View File

@ -22,7 +22,8 @@ NS_ASSUME_NONNULL_BEGIN
* RTCSessionDescription object. This is needed to pass to the underlying C++
* APIs.
*/
@property(nonatomic, readonly, nullable) webrtc::SessionDescriptionInterface *nativeDescription;
@property(nonatomic,
readonly) std::unique_ptr<webrtc::SessionDescriptionInterface> nativeDescription;
/**
* Initialize an RTCSessionDescription from a native

View File

@ -46,13 +46,11 @@
#pragma mark - Private
- (webrtc::SessionDescriptionInterface *)nativeDescription {
- (std::unique_ptr<webrtc::SessionDescriptionInterface>)nativeDescription {
webrtc::SdpParseError error;
webrtc::SessionDescriptionInterface *description =
webrtc::CreateSessionDescription([[self class] stdStringForType:_type],
_sdp.stdString,
&error);
std::unique_ptr<webrtc::SessionDescriptionInterface> description(webrtc::CreateSessionDescription(
[[self class] stdStringForType:_type], _sdp.stdString, &error));
if (!description) {
RTCLogError(@"Failed to create session description: %s\nline: %s",