Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc

Issue 1182793002: Prevent heap overflows for incorrect FEC packet lengths. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <string.h> 11 #include <string.h>
12 12
13 #include <list> 13 #include <list>
14 14
15 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webrtc/base/scoped_ptr.h" 17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/modules/rtp_rtcp/interface/fec_receiver.h" 18 #include "webrtc/modules/rtp_rtcp/interface/fec_receiver.h"
19 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 19 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
20 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" 20 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
21 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h" 22 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
22 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" 23 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
23 24
24 using ::testing::_; 25 using ::testing::_;
25 using ::testing::Args; 26 using ::testing::Args;
26 using ::testing::ElementsAreArray; 27 using ::testing::ElementsAreArray;
27 using ::testing::Return; 28 using ::testing::Return;
28 29
29 namespace webrtc { 30 namespace webrtc {
30 31
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 } 76 }
76 77
77 void BuildAndAddRedFecPacket(Packet* packet) { 78 void BuildAndAddRedFecPacket(Packet* packet) {
78 RtpPacket* red_packet = generator_->BuildFecRedPacket(packet); 79 RtpPacket* red_packet = generator_->BuildFecRedPacket(packet);
79 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket( 80 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
80 red_packet->header.header, red_packet->data, 81 red_packet->header.header, red_packet->data,
81 red_packet->length, kFecPayloadType)); 82 red_packet->length, kFecPayloadType));
82 delete red_packet; 83 delete red_packet;
83 } 84 }
84 85
86 void InjectGarbagePacketLength(size_t fec_garbage_offset);
85 static void SurvivesMaliciousPacket(const uint8_t* data, 87 static void SurvivesMaliciousPacket(const uint8_t* data,
86 size_t length, 88 size_t length,
87 uint8_t ulpfec_payload_type); 89 uint8_t ulpfec_payload_type);
88 90
89 MockRtpData rtp_data_callback_; 91 MockRtpData rtp_data_callback_;
90 rtc::scoped_ptr<ForwardErrorCorrection> fec_; 92 rtc::scoped_ptr<ForwardErrorCorrection> fec_;
91 rtc::scoped_ptr<FecReceiver> receiver_fec_; 93 rtc::scoped_ptr<FecReceiver> receiver_fec_;
92 rtc::scoped_ptr<FrameGenerator> generator_; 94 rtc::scoped_ptr<FrameGenerator> generator_;
93 }; 95 };
94 96
95 void DeletePackets(std::list<Packet*>* packets) { 97 void DeletePackets(std::list<Packet*>* packets) {
96 while (!packets->empty()) { 98 while (!packets->empty()) {
97 delete packets->front(); 99 delete packets->front();
98 packets->pop_front(); 100 packets->pop_front();
99 } 101 }
100 } 102 }
101 103
102 TEST_F(ReceiverFecTest, TwoMediaOneFec) { 104 TEST_F(ReceiverFecTest, TwoMediaOneFec) {
103 const unsigned int kNumFecPackets = 1u; 105 const unsigned int kNumFecPackets = 1u;
104 std::list<RtpPacket*> media_rtp_packets; 106 std::list<RtpPacket*> media_rtp_packets;
105 std::list<Packet*> media_packets; 107 std::list<Packet*> media_packets;
106 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 108 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
107 std::list<Packet*> fec_packets; 109 std::list<Packet*> fec_packets;
108 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 110 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
109 111
110 // Recovery 112 // Recovery
111 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin(); 113 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin();
112 std::list<RtpPacket*>::iterator media_it = media_rtp_packets.begin(); 114 BuildAndAddRedMediaPacket(*it);
113 BuildAndAddRedMediaPacket(*media_it);
114 VerifyReconstructedMediaPacket(*it, 1); 115 VerifyReconstructedMediaPacket(*it, 1);
115 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 116 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
116 // Drop one media packet. 117 // Drop one media packet.
117 std::list<Packet*>::iterator fec_it = fec_packets.begin(); 118 std::list<Packet*>::iterator fec_it = fec_packets.begin();
118 BuildAndAddRedFecPacket(*fec_it); 119 BuildAndAddRedFecPacket(*fec_it);
119 ++it; 120 ++it;
120 VerifyReconstructedMediaPacket(*it, 1); 121 VerifyReconstructedMediaPacket(*it, 1);
121 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec()); 122 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
122 123
123 FecPacketCounter counter = receiver_fec_->GetPacketCounter(); 124 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
124 EXPECT_EQ(2U, counter.num_packets); 125 EXPECT_EQ(2U, counter.num_packets);
125 EXPECT_EQ(1U, counter.num_fec_packets); 126 EXPECT_EQ(1U, counter.num_fec_packets);
126 EXPECT_EQ(1U, counter.num_recovered_packets); 127 EXPECT_EQ(1U, counter.num_recovered_packets);
127 128
128 DeletePackets(&media_packets); 129 DeletePackets(&media_packets);
129 } 130 }
130 131
132 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
133 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
134 .WillRepeatedly(Return(true));
135
136 const unsigned int kNumFecPackets = 1u;
137 std::list<RtpPacket*> media_rtp_packets;
138 std::list<Packet*> media_packets;
139 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
140 std::list<Packet*> fec_packets;
141 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
142 ByteWriter<uint16_t>::WriteBigEndian(
143 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
144
145 // Recovery
146 std::list<RtpPacket*>::iterator it = media_rtp_packets.begin();
147 BuildAndAddRedMediaPacket(*it);
stefan-webrtc 2015/07/02 09:31:25 This doesn't really do any recovery, right? Can yo
pbos-webrtc 2015/07/02 13:54:55 Don't even think I should be running it (line 149)
148
149 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
150 // Drop one media packet.
151 std::list<Packet*>::iterator fec_it = fec_packets.begin();
152 BuildAndAddRedFecPacket(*fec_it);
153 ++it;
154 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
155
156 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
157 EXPECT_EQ(2u, counter.num_packets);
158 EXPECT_EQ(1u, counter.num_fec_packets);
159 EXPECT_EQ(0u, counter.num_recovered_packets);
160
161 DeletePackets(&media_packets);
162 }
163
164 TEST_F(ReceiverFecTest, InjectGarbageRecoveredPacketLength) {
165 InjectGarbagePacketLength(8);
166 }
167
168 TEST_F(ReceiverFecTest, InjectGarbagePacketLength) {
169 InjectGarbagePacketLength(10);
stefan-webrtc 2015/07/02 09:31:26 Can you comment on why those offsets are interesti
pbos-webrtc 2015/07/02 13:54:55 Done, also updated test names to reflect this.
170 }
171
131 TEST_F(ReceiverFecTest, TwoMediaTwoFec) { 172 TEST_F(ReceiverFecTest, TwoMediaTwoFec) {
132 const unsigned int kNumFecPackets = 2u; 173 const unsigned int kNumFecPackets = 2u;
133 std::list<RtpPacket*> media_rtp_packets; 174 std::list<RtpPacket*> media_rtp_packets;
134 std::list<Packet*> media_packets; 175 std::list<Packet*> media_packets;
135 GenerateFrame(2, 0, &media_rtp_packets, &media_packets); 176 GenerateFrame(2, 0, &media_rtp_packets, &media_packets);
136 std::list<Packet*> fec_packets; 177 std::list<Packet*> fec_packets;
137 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets); 178 GenerateFEC(&media_packets, &fec_packets, kNumFecPackets);
138 179
139 // Recovery 180 // Recovery
140 // Drop both media packets. 181 // Drop both media packets.
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 0x27, 530 0x27,
490 0xc4, 531 0xc4,
491 0x2a, 532 0x2a,
492 0x21, 533 0x21,
493 0x2a, 534 0x2a,
494 0x28}; 535 0x28};
495 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100); 536 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
496 } 537 }
497 538
498 } // namespace webrtc 539 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698