Browse Source

Fixed non-standard use of flexible array member in RtpHeader

Paul-Louis Ageneau 3 years ago
parent
commit
31e2dcc727
2 changed files with 10 additions and 21 deletions
  1. 1 1
      include/rtc/rtp.hpp
  2. 9 20
      src/rtp.cpp

+ 1 - 1
include/rtc/rtp.hpp

@@ -57,7 +57,7 @@ struct RTC_CPP_EXPORT RtpHeader {
 	uint16_t _seqNumber;
 	uint32_t _timestamp;
 	SSRC _ssrc;
-	SSRC _csrc[];
+	// The following field is SSRC _csrc[]
 
 	[[nodiscard]] uint8_t version() const;
 	[[nodiscard]] bool padding() const;

+ 9 - 20
src/rtp.cpp

@@ -69,41 +69,30 @@ uint32_t RtpHeader::timestamp() const { return ntohl(_timestamp); }
 uint32_t RtpHeader::ssrc() const { return ntohl(_ssrc); }
 
 size_t RtpHeader::getSize() const {
-	return reinterpret_cast<const char *>(&_csrc) - reinterpret_cast<const char *>(this) +
-	       sizeof(SSRC) * csrcCount();
+	return reinterpret_cast<const char *>(&_ssrc + 1 + csrcCount()) -
+	       reinterpret_cast<const char *>(this);
 }
 
 size_t RtpHeader::getExtensionHeaderSize() const {
-	auto header = reinterpret_cast<const RtpExtensionHeader *>(getExtensionHeader());
-	if (header) {
-		return header->getSize() + sizeof(RtpExtensionHeader);
-	}
-	return 0;
+	auto header = getExtensionHeader();
+	return header ? header->getSize() + sizeof(RtpExtensionHeader) : 0;
 }
 
 const RtpExtensionHeader *RtpHeader::getExtensionHeader() const {
-	if (extension()) {
-		auto header = reinterpret_cast<const char *>(&_csrc) + sizeof(SSRC) * csrcCount();
-		return reinterpret_cast<const RtpExtensionHeader *>(header);
-	}
-	return nullptr;
+	return extension() ? reinterpret_cast<const RtpExtensionHeader *>(&_ssrc + 1 + csrcCount())
+	                   : nullptr;
 }
 
 RtpExtensionHeader *RtpHeader::getExtensionHeader() {
-	if (extension()) {
-		auto header = reinterpret_cast<char *>(&_csrc) + sizeof(SSRC) * csrcCount();
-		return reinterpret_cast<RtpExtensionHeader *>(header);
-	}
-	return nullptr;
+	return extension() ? reinterpret_cast<RtpExtensionHeader *>(&_ssrc + 1 + csrcCount()) : nullptr;
 }
 
 const char *RtpHeader::getBody() const {
-	return reinterpret_cast<const char *>(&_csrc) + sizeof(SSRC) * csrcCount() +
-	       getExtensionHeaderSize();
+	return reinterpret_cast<const char *>(&_ssrc + 1 + csrcCount()) + getExtensionHeaderSize();
 }
 
 char *RtpHeader::getBody() {
-	return reinterpret_cast<char *>(&_csrc) + sizeof(SSRC) * csrcCount() + getExtensionHeaderSize();
+	return reinterpret_cast<char *>(&_ssrc + 1 + csrcCount()) + getExtensionHeaderSize();
 }
 
 void RtpHeader::preparePacket() { _first |= (1 << 7); }