Fix heap use overrun in FakeEncoder
By removing unnecessary fixed size buffer. BUG=webrtc:10276 Change-Id: I303303d8c4aa356372875abe6db5711cd10bcc71 Reviewed-on: https://webrtc-review.googlesource.com/c/120811 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Commit-Queue: Per Kjellander <perkj@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26509}
This commit is contained in:

committed by
Commit Bot

parent
4f6c539105
commit
65cc52ebca
@ -34,8 +34,7 @@ FakeVideoEncoderFactory::FakeVideoEncoderFactory() = default;
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
std::unique_ptr<VideoEncoder> FakeVideoEncoderFactory::CreateVideoEncoder() {
|
std::unique_ptr<VideoEncoder> FakeVideoEncoderFactory::CreateVideoEncoder() {
|
||||||
return absl::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock(),
|
return absl::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock());
|
||||||
10000000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SdpVideoFormat> FakeVideoEncoderFactory::GetSupportedFormats()
|
std::vector<SdpVideoFormat> FakeVideoEncoderFactory::GetSupportedFormats()
|
||||||
@ -51,8 +50,7 @@ VideoEncoderFactory::CodecInfo FakeVideoEncoderFactory::QueryVideoEncoder(
|
|||||||
|
|
||||||
std::unique_ptr<VideoEncoder> FakeVideoEncoderFactory::CreateVideoEncoder(
|
std::unique_ptr<VideoEncoder> FakeVideoEncoderFactory::CreateVideoEncoder(
|
||||||
const SdpVideoFormat& format) {
|
const SdpVideoFormat& format) {
|
||||||
return absl::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock(),
|
return absl::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock());
|
||||||
10000000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FakeVideoDecoderFactory::FakeVideoDecoderFactory() = default;
|
FakeVideoDecoderFactory::FakeVideoDecoderFactory() = default;
|
||||||
|
@ -47,9 +47,7 @@ void WriteCounter(unsigned char* payload, uint32_t counter) {
|
|||||||
|
|
||||||
}; // namespace
|
}; // namespace
|
||||||
|
|
||||||
FakeEncoder::FakeEncoder(Clock* clock) : FakeEncoder(clock, 100000) {}
|
FakeEncoder::FakeEncoder(Clock* clock)
|
||||||
|
|
||||||
FakeEncoder::FakeEncoder(Clock* clock, size_t buffer_size)
|
|
||||||
: clock_(clock),
|
: clock_(clock),
|
||||||
callback_(nullptr),
|
callback_(nullptr),
|
||||||
configured_input_framerate_(-1),
|
configured_input_framerate_(-1),
|
||||||
@ -57,11 +55,6 @@ FakeEncoder::FakeEncoder(Clock* clock, size_t buffer_size)
|
|||||||
pending_keyframe_(true),
|
pending_keyframe_(true),
|
||||||
counter_(0),
|
counter_(0),
|
||||||
debt_bytes_(0) {
|
debt_bytes_(0) {
|
||||||
// Generate some arbitrary not-all-zero data
|
|
||||||
encoded_buffer_.resize(buffer_size);
|
|
||||||
for (size_t i = 0; i < encoded_buffer_.size(); ++i) {
|
|
||||||
encoded_buffer_[i] = static_cast<uint8_t>(i);
|
|
||||||
}
|
|
||||||
for (bool& used : used_layers_) {
|
for (bool& used : used_layers_) {
|
||||||
used = false;
|
used = false;
|
||||||
}
|
}
|
||||||
@ -133,12 +126,12 @@ int32_t FakeEncoder::Encode(const VideoFrame& input_image,
|
|||||||
specifics.codecType = kVideoCodecGeneric;
|
specifics.codecType = kVideoCodecGeneric;
|
||||||
std::unique_ptr<uint8_t[]> encoded_buffer(
|
std::unique_ptr<uint8_t[]> encoded_buffer(
|
||||||
new uint8_t[frame_info.layers[i].size]);
|
new uint8_t[frame_info.layers[i].size]);
|
||||||
memcpy(encoded_buffer.get(), encoded_buffer_.data(),
|
// Fill the buffer with arbitrary data. Write someting to make Asan happy.
|
||||||
frame_info.layers[i].size - 4);
|
memset(encoded_buffer.get(), 9, frame_info.layers[i].size);
|
||||||
// Write a counter to the image to make each frame unique.
|
// Write a counter to the image to make each frame unique.
|
||||||
WriteCounter(encoded_buffer.get() + frame_info.layers[i].size - 4, counter);
|
WriteCounter(encoded_buffer.get() + frame_info.layers[i].size - 4, counter);
|
||||||
EncodedImage encoded(encoded_buffer.get(), frame_info.layers[i].size,
|
EncodedImage encoded(encoded_buffer.get(), frame_info.layers[i].size,
|
||||||
encoded_buffer_.size());
|
frame_info.layers[i].size);
|
||||||
encoded.SetTimestamp(input_image.timestamp());
|
encoded.SetTimestamp(input_image.timestamp());
|
||||||
encoded.capture_time_ms_ = input_image.render_time_ms();
|
encoded.capture_time_ms_ = input_image.render_time_ms();
|
||||||
encoded._frameType =
|
encoded._frameType =
|
||||||
|
@ -36,7 +36,6 @@ namespace test {
|
|||||||
class FakeEncoder : public VideoEncoder {
|
class FakeEncoder : public VideoEncoder {
|
||||||
public:
|
public:
|
||||||
explicit FakeEncoder(Clock* clock);
|
explicit FakeEncoder(Clock* clock);
|
||||||
FakeEncoder(Clock* clock, size_t buffer_size);
|
|
||||||
virtual ~FakeEncoder() = default;
|
virtual ~FakeEncoder() = default;
|
||||||
|
|
||||||
// Sets max bitrate. Not thread-safe, call before registering the encoder.
|
// Sets max bitrate. Not thread-safe, call before registering the encoder.
|
||||||
@ -91,8 +90,6 @@ class FakeEncoder : public VideoEncoder {
|
|||||||
bool pending_keyframe_ RTC_GUARDED_BY(crit_sect_);
|
bool pending_keyframe_ RTC_GUARDED_BY(crit_sect_);
|
||||||
uint32_t counter_ RTC_GUARDED_BY(crit_sect_);
|
uint32_t counter_ RTC_GUARDED_BY(crit_sect_);
|
||||||
rtc::CriticalSection crit_sect_;
|
rtc::CriticalSection crit_sect_;
|
||||||
|
|
||||||
std::vector<uint8_t> encoded_buffer_;
|
|
||||||
bool used_layers_[kMaxSimulcastStreams];
|
bool used_layers_[kMaxSimulcastStreams];
|
||||||
|
|
||||||
// Current byte debt to be payed over a number of frames.
|
// Current byte debt to be payed over a number of frames.
|
||||||
|
Reference in New Issue
Block a user