aboutsummaryrefslogtreecommitdiff
path: root/p2p
diff options
context:
space:
mode:
authorTomas Gunnarsson <tommi@webrtc.org>2021-02-08 18:57:04 +0100
committerCommit Bot <commit-bot@chromium.org>2021-02-11 09:54:45 +0000
commit8cb97062880b0e0a78f9d578370a01aced81a13f (patch)
tree6a90faa828efda192ba20f1820d7e0a041ed7c85 /p2p
parentff0e01f6894b5058e1db7145f5dfde0941f22d8b (diff)
downloadwebrtc-8cb97062880b0e0a78f9d578370a01aced81a13f.tar.gz
AddRemoteCandidate on the network thread
SdpOfferAnswerHandler now hands over most of the work of adding a remote candidate over to PeerConnection where the work will be carried out asynchronously on the network thread (was synchronous/blocking). Once added, reporting (ReportRemoteIceCandidateAdded) continues on the signaling thread as before. The difference is though that we don't block the UseCandidate() operation which is a part of applying the local and remote descriptions. Besides now being asynchronous, there's one behavioural change: Before starting the 'add' operation, the validity of the candidate instance to be added, is checked. Previously if such an error occurred, the error was silently ignored. Bug: webrtc:9987 Change-Id: Ic1bfb8e27670fc81038b6ccec95ff36c65d12262 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/206063 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33230}
Diffstat (limited to 'p2p')
-rw-r--r--p2p/base/ice_transport_internal.cc44
-rw-r--r--p2p/base/ice_transport_internal.h12
2 files changed, 56 insertions, 0 deletions
diff --git a/p2p/base/ice_transport_internal.cc b/p2p/base/ice_transport_internal.cc
index 1d5b6e7403..104a95b5af 100644
--- a/p2p/base/ice_transport_internal.cc
+++ b/p2p/base/ice_transport_internal.cc
@@ -14,6 +14,50 @@
namespace cricket {
+using webrtc::RTCError;
+using webrtc::RTCErrorType;
+
+RTCError VerifyCandidate(const Candidate& cand) {
+ // No address zero.
+ if (cand.address().IsNil() || cand.address().IsAnyIP()) {
+ return RTCError(RTCErrorType::INVALID_PARAMETER,
+ "candidate has address of zero");
+ }
+
+ // Disallow all ports below 1024, except for 80 and 443 on public addresses.
+ int port = cand.address().port();
+ if (cand.protocol() == cricket::TCP_PROTOCOL_NAME &&
+ (cand.tcptype() == cricket::TCPTYPE_ACTIVE_STR || port == 0)) {
+ // Expected for active-only candidates per
+ // http://tools.ietf.org/html/rfc6544#section-4.5 so no error.
+ // Libjingle clients emit port 0, in "active" mode.
+ return RTCError::OK();
+ }
+ if (port < 1024) {
+ if ((port != 80) && (port != 443)) {
+ return RTCError(RTCErrorType::INVALID_PARAMETER,
+ "candidate has port below 1024, but not 80 or 443");
+ }
+
+ if (cand.address().IsPrivateIP()) {
+ return RTCError(
+ RTCErrorType::INVALID_PARAMETER,
+ "candidate has port of 80 or 443 with private IP address");
+ }
+ }
+
+ return RTCError::OK();
+}
+
+RTCError VerifyCandidates(const Candidates& candidates) {
+ for (const Candidate& candidate : candidates) {
+ RTCError error = VerifyCandidate(candidate);
+ if (!error.ok())
+ return error;
+ }
+ return RTCError::OK();
+}
+
IceConfig::IceConfig() = default;
IceConfig::IceConfig(int receiving_timeout_ms,
diff --git a/p2p/base/ice_transport_internal.h b/p2p/base/ice_transport_internal.h
index b735a1a742..b3eb2dc9e2 100644
--- a/p2p/base/ice_transport_internal.h
+++ b/p2p/base/ice_transport_internal.h
@@ -18,6 +18,7 @@
#include "absl/types/optional.h"
#include "api/candidate.h"
+#include "api/rtc_error.h"
#include "api/transport/enums.h"
#include "p2p/base/connection.h"
#include "p2p/base/packet_transport_internal.h"
@@ -74,6 +75,17 @@ enum class NominationMode {
// The details are described in P2PTransportChannel.
};
+// Utility method that checks if various required Candidate fields are filled in
+// and contain valid values. If conditions are not met, an RTCError with the
+// appropriated error number and description is returned. If the configuration
+// is valid RTCError::OK() is returned.
+webrtc::RTCError VerifyCandidate(const Candidate& cand);
+
+// Runs through a list of cricket::Candidate instances and calls VerifyCandidate
+// for each one, stopping on the first error encounted and returning that error
+// value if so. On success returns RTCError::OK().
+webrtc::RTCError VerifyCandidates(const Candidates& candidates);
+
// Information about ICE configuration.
// TODO(deadbeef): Use absl::optional to represent unset values, instead of
// -1.