Fix candidate leak with initWithNativeCandidate.

[RTCIceCandidate initWithNativeCandidate:] does not take ownership on
candidate, so it must be released by caller.

Bug: None
Change-Id: I516e740e81a7aec04556f5fa71cbbecf3be6deb7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/308500
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40314}
This commit is contained in:
Yury Yarashevich 2023-06-17 21:23:28 +02:00 committed by WebRTC LUCI CQ
parent 6efbd1fdbc
commit e5ee43787a
2 changed files with 12 additions and 12 deletions

View File

@ -251,10 +251,9 @@ void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
NSMutableArray* ice_candidates = NSMutableArray* ice_candidates =
[NSMutableArray arrayWithCapacity:candidates.size()]; [NSMutableArray arrayWithCapacity:candidates.size()];
for (const auto& candidate : candidates) { for (const auto& candidate : candidates) {
std::unique_ptr<JsepIceCandidate> candidate_wrapper( JsepIceCandidate candidate_wrapper(candidate.transport_name(), -1, candidate);
new JsepIceCandidate(candidate.transport_name(), -1, candidate));
RTC_OBJC_TYPE(RTCIceCandidate) *ice_candidate = RTC_OBJC_TYPE(RTCIceCandidate) *ice_candidate =
[[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:candidate_wrapper.get()]; [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:&candidate_wrapper];
[ice_candidates addObject:ice_candidate]; [ice_candidates addObject:ice_candidate];
} }
RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_; RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
@ -265,14 +264,14 @@ void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
void PeerConnectionDelegateAdapter::OnIceSelectedCandidatePairChanged( void PeerConnectionDelegateAdapter::OnIceSelectedCandidatePairChanged(
const cricket::CandidatePairChangeEvent &event) { const cricket::CandidatePairChangeEvent &event) {
const auto &selected_pair = event.selected_candidate_pair; const auto &selected_pair = event.selected_candidate_pair;
auto local_candidate_wrapper = std::make_unique<JsepIceCandidate>( JsepIceCandidate local_candidate_wrapper(
selected_pair.local_candidate().transport_name(), -1, selected_pair.local_candidate()); selected_pair.local_candidate().transport_name(), -1, selected_pair.local_candidate());
RTC_OBJC_TYPE(RTCIceCandidate) *local_candidate = [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] RTC_OBJC_TYPE(RTCIceCandidate) *local_candidate =
initWithNativeCandidate:local_candidate_wrapper.release()]; [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:&local_candidate_wrapper];
auto remote_candidate_wrapper = std::make_unique<JsepIceCandidate>( JsepIceCandidate remote_candidate_wrapper(
selected_pair.remote_candidate().transport_name(), -1, selected_pair.remote_candidate()); selected_pair.remote_candidate().transport_name(), -1, selected_pair.remote_candidate());
RTC_OBJC_TYPE(RTCIceCandidate) *remote_candidate = [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] RTC_OBJC_TYPE(RTCIceCandidate) *remote_candidate =
initWithNativeCandidate:remote_candidate_wrapper.release()]; [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:&remote_candidate_wrapper];
RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_; RTC_OBJC_TYPE(RTCPeerConnection) *peer_connection = peer_connection_;
NSString *nsstr_reason = [NSString stringForStdString:event.reason]; NSString *nsstr_reason = [NSString stringForStdString:event.reason];
if ([peer_connection.delegate if ([peer_connection.delegate

View File

@ -46,11 +46,12 @@
std::string sdp("candidate:4025901590 1 udp 2122265343 " std::string sdp("candidate:4025901590 1 udp 2122265343 "
"fdff:2642:12a6:fe38:c001:beda:fcf9:51aa " "fdff:2642:12a6:fe38:c001:beda:fcf9:51aa "
"59052 typ host generation 0"); "59052 typ host generation 0");
webrtc::IceCandidateInterface *nativeCandidate = std::unique_ptr<webrtc::IceCandidateInterface> nativeCandidate(
webrtc::CreateIceCandidate("audio", 0, sdp, nullptr); webrtc::CreateIceCandidate("audio", 0, sdp, nullptr));
RTC_OBJC_TYPE(RTCIceCandidate) *iceCandidate = RTC_OBJC_TYPE(RTCIceCandidate) *iceCandidate =
[[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:nativeCandidate]; [[RTC_OBJC_TYPE(RTCIceCandidate) alloc] initWithNativeCandidate:nativeCandidate.get()];
EXPECT_NE(nativeCandidate.get(), iceCandidate.nativeCandidate.get());
EXPECT_TRUE([@"audio" isEqualToString:iceCandidate.sdpMid]); EXPECT_TRUE([@"audio" isEqualToString:iceCandidate.sdpMid]);
EXPECT_EQ(0, iceCandidate.sdpMLineIndex); EXPECT_EQ(0, iceCandidate.sdpMLineIndex);