sdp: add validation for the number of ssrcs in the ssrc group
for the known standard semantics FID (used by rtx) and
FEC-FR (used byFlexFEC) they should match the expected two SSRCs.
For the nonstandard SIM group this should be limited by the maximum
number of simulcast layers supported.
BUG=chromium:1459124
Change-Id: I7cc2417a3ab207658ec80e8d7e9984c1ae631f53
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/315323
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#40652}
diff --git a/pc/sdp_offer_answer.cc b/pc/sdp_offer_answer.cc
index 7d7edd2..06303de 100644
--- a/pc/sdp_offer_answer.cc
+++ b/pc/sdp_offer_answer.cc
@@ -535,6 +535,33 @@
return RTCError::OK();
}
+RTCError ValidateSsrcGroups(const cricket::SessionDescription& description) {
+ for (const ContentInfo& content : description.contents()) {
+ if (content.type != MediaProtocolType::kRtp) {
+ continue;
+ }
+ for (const StreamParams& stream : content.media_description()->streams()) {
+ for (const cricket::SsrcGroup& group : stream.ssrc_groups) {
+ // Validate the number of SSRCs for standard SSRC group semantics such
+ // as FID and FEC-FR and the non-standard SIM group.
+ if ((group.semantics == cricket::kFidSsrcGroupSemantics &&
+ group.ssrcs.size() != 2) ||
+ (group.semantics == cricket::kFecFrSsrcGroupSemantics &&
+ group.ssrcs.size() != 2) ||
+ (group.semantics == cricket::kSimSsrcGroupSemantics &&
+ group.ssrcs.size() > kMaxSimulcastStreams)) {
+ LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
+ "The media section with MID='" + content.mid() +
+ "' has a ssrc-group with semantics " +
+ group.semantics +
+ " and an unexpected number of SSRCs.");
+ }
+ }
+ }
+ }
+ return RTCError::OK();
+}
+
bool IsValidOfferToReceiveMedia(int value) {
typedef PeerConnectionInterface::RTCOfferAnswerOptions Options;
return (value >= Options::kUndefined) &&
@@ -3547,6 +3574,13 @@
return error;
}
+ // TODO(crbug.com/1459124): remove killswitch after rollout.
+ error = ValidateSsrcGroups(*sdesc->description());
+ if (!error.ok() &&
+ !pc_->trials().IsDisabled("WebRTC-PreventSsrcGroupsWithUnexpectedSize")) {
+ return error;
+ }
+
if (!pc_->ValidateBundleSettings(sdesc->description(),
bundle_groups_by_mid)) {
LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,