Skip to content

Commit 9904d3c

Browse files
Fix NACK messages corruption
1 parent 0487131 commit 9904d3c

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

include/rtc/message.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ RTC_CPP_EXPORT message_ptr make_message(binary &&data, Message::Type type = Mess
5959
unsigned int stream = 0,
6060
shared_ptr<Reliability> reliability = nullptr);
6161

62+
RTC_CPP_EXPORT message_ptr make_message(size_t size, message_ptr orig);
63+
6264
RTC_CPP_EXPORT message_ptr make_message(message_variant data);
6365

6466
#if RTC_ENABLE_MEDIA

src/impl/dtlssrtptransport.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ bool DtlsSrtpTransport::sendMedia(message_ptr message) {
104104

105105
// srtp_protect() and srtp_protect_rtcp() assume that they can write SRTP_MAX_TRAILER_LEN (for
106106
// the authentication tag) into the location in memory immediately following the RTP packet.
107-
message->resize(size + SRTP_MAX_TRAILER_LEN);
107+
// Copy instead of resizing so we don't interfere with media handlers keeping references
108+
message = make_message(message->size() + SRTP_MAX_TRAILER_LEN, message);
108109

109110
if (IsRtcp(*message)) { // Demultiplex RTCP and RTP using payload type
110111
if (srtp_err_status_t err = srtp_protect_rtcp(mSrtpOut, message->data(), &size)) {

src/message.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ message_ptr make_message(binary &&data, Message::Type type, unsigned int stream,
2626
return message;
2727
}
2828

29+
message_ptr make_message(size_t size, message_ptr orig) {
30+
if(!orig)
31+
return nullptr;
32+
33+
auto message = std::make_shared<Message>(size, orig->type);
34+
std::copy(orig->begin(), std::min(orig->end(), orig->begin() + size), message->begin());
35+
message->stream = orig->stream;
36+
message->reliability = orig->reliability;
37+
return message;
38+
}
39+
2940
message_ptr make_message(message_variant data) {
3041
return std::visit( //
3142
overloaded{

0 commit comments

Comments
 (0)