From 74395a279c472f097df1d3df491dd515babdbb1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=95=8Ao=E9=A2=9Diu=E9=B1=BC?= Date: Fri, 10 Sep 2021 11:02:25 +0800 Subject: [PATCH] Fix traversal crash of queuedRemoteCandidates It is also dangerous to use a for loop to traverse the list outside the pc thread. Especially when the code running efficiency is slowed down in debug mode, it is more likely to cause a crash when the remove is executed before the loop is completed. --- .../main/java/owt/base/PeerConnectionChannel.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sdk/base/src/main/java/owt/base/PeerConnectionChannel.java b/src/sdk/base/src/main/java/owt/base/PeerConnectionChannel.java index 5544187..df7c19b 100644 --- a/src/sdk/base/src/main/java/owt/base/PeerConnectionChannel.java +++ b/src/sdk/base/src/main/java/owt/base/PeerConnectionChannel.java @@ -173,18 +173,20 @@ private void addOrQueueCandidate(final IceCandidate iceCandidate) { protected void drainRemoteCandidates() { DCHECK(pcExecutor); DCHECK(queuedRemoteCandidates); - synchronized (remoteIceLock) { - for (final IceCandidate candidate : queuedRemoteCandidates) { - pcExecutor.execute(() -> { + pcExecutor.execute(() -> { + synchronized (remoteIceLock) { + Iterator iterator = queuedRemoteCandidates.iterator(); + while (iterator.hasNext()) { if (disposed()) { return; } + IceCandidate candidate = iterator.next(); Log.d(LOG_TAG, "add ice candidate"); peerConnection.addIceCandidate(candidate); - queuedRemoteCandidates.remove(candidate); - }); + iterator.remove(); + } } - } + }); } private void setRemoteDescription(final SessionDescription remoteDescription) {