Răsfoiți Sursa

Merge pull request #1081 from paullouisageneau/fix-media-sdp-mline-parsing

Fix media description m-line parsing
Paul-Louis Ageneau 1 an în urmă
părinte
comite
715e296b7b
2 a modificat fișierele cu 21 adăugiri și 4 ștergeri
  1. 16 4
      src/description.cpp
  2. 5 0
      test/track.cpp

+ 16 - 4
src/description.cpp

@@ -44,6 +44,13 @@ inline void trim_end(string &str) {
 	    str.end());
 }
 
+inline string get_first_line(const string &str) {
+	string line;
+	std::istringstream ss(str);
+	std::getline(ss, line);
+	return line;
+}
+
 inline std::pair<string_view, string_view> parse_pair(string_view attr) {
 	string_view key, value;
 	if (size_t separator = attr.find(':'); separator != string::npos) {
@@ -523,12 +530,15 @@ unsigned int Description::mediaCount() const { return unsigned(mEntries.size());
 Description::Entry::Entry(const string &mline, string mid, Direction dir)
     : mMid(std::move(mid)), mDirection(dir) {
 
-	uint16_t port;
-	std::istringstream ss(mline);
+	uint16_t port = 0;
+	std::istringstream ss(match_prefix(mline, "m=") ? mline.substr(2) : mline);
 	ss >> mType;
 	ss >> port;
 	ss >> mDescription;
 
+	if (mType.empty() || mDescription.empty())
+		throw std::invalid_argument("Invalid media description line");
+
 	// RFC 3264: Existing media streams are removed by creating a new SDP with the port number for
 	// that stream set to zero.
 	// RFC 8843: If the offerer assigns a zero port value to a bundled "m=" section, but does not
@@ -866,10 +876,12 @@ void Description::Application::parseSdpLine(string_view line) {
 	}
 }
 
-Description::Media::Media(const string &sdp) : Entry(sdp, "", Direction::Unknown) {
+Description::Media::Media(const string &sdp)
+    : Entry(get_first_line(sdp), "", Direction::Unknown) {
+	string line;
 	std::istringstream ss(sdp);
+	std::getline(ss, line); // discard first line
 	while (ss) {
-		string line;
 		std::getline(ss, line);
 		trim_end(line);
 		if (line.empty())

+ 5 - 0
test/track.cpp

@@ -95,6 +95,11 @@ void test_track() {
 	media.setBitrate(3000);
 	media.addSSRC(1234, "video-send");
 
+	const auto mediaSdp1 = string(media);
+	const auto mediaSdp2 = string(Description::Media(mediaSdp1));
+	if (mediaSdp2 != mediaSdp1)
+		throw runtime_error("Media description parsing test failed");
+
 	auto t1 = pc1.addTrack(media);
 
 	pc1.setLocalDescription();