
When remote side closes, opensslstreamadapter could return SR_EOS which will not trigger upper layer to clean up what's left in the StreamInterfaceChannel. The result of this is when there are more packets coming in, the Write on the StreamInterfaceChannel will overflow the buffer. The fix here is that when receiving the remote side close signal, we also close the underneath StreamInterfaceChannel which will clean up the queue to prevent overflow. BUG=574524 TBR=pthatcher@webrtc.org Review URL: https://codereview.webrtc.org/1566023002 Cr-Commit-Position: refs/heads/master@{#11751}
95 lines
2.1 KiB
C++
95 lines
2.1 KiB
C++
/*
|
|
* Copyright 2015 The WebRTC Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "webrtc/base/bufferqueue.h"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace rtc {
|
|
|
|
BufferQueue::BufferQueue(size_t capacity, size_t default_size)
|
|
: capacity_(capacity), default_size_(default_size) {
|
|
}
|
|
|
|
BufferQueue::~BufferQueue() {
|
|
CritScope cs(&crit_);
|
|
|
|
for (Buffer* buffer : queue_) {
|
|
delete buffer;
|
|
}
|
|
for (Buffer* buffer : free_list_) {
|
|
delete buffer;
|
|
}
|
|
}
|
|
|
|
size_t BufferQueue::size() const {
|
|
CritScope cs(&crit_);
|
|
return queue_.size();
|
|
}
|
|
|
|
void BufferQueue::Clear() {
|
|
CritScope cs(&crit_);
|
|
while (!queue_.empty()) {
|
|
free_list_.push_back(queue_.front());
|
|
queue_.pop_front();
|
|
}
|
|
}
|
|
|
|
bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) {
|
|
CritScope cs(&crit_);
|
|
if (queue_.empty()) {
|
|
return false;
|
|
}
|
|
|
|
bool was_writable = queue_.size() < capacity_;
|
|
Buffer* packet = queue_.front();
|
|
queue_.pop_front();
|
|
|
|
bytes = std::min(bytes, packet->size());
|
|
memcpy(buffer, packet->data(), bytes);
|
|
if (bytes_read) {
|
|
*bytes_read = bytes;
|
|
}
|
|
free_list_.push_back(packet);
|
|
if (!was_writable) {
|
|
NotifyWritableForTest();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool BufferQueue::WriteBack(const void* buffer, size_t bytes,
|
|
size_t* bytes_written) {
|
|
CritScope cs(&crit_);
|
|
if (queue_.size() == capacity_) {
|
|
return false;
|
|
}
|
|
|
|
bool was_readable = !queue_.empty();
|
|
Buffer* packet;
|
|
if (!free_list_.empty()) {
|
|
packet = free_list_.back();
|
|
free_list_.pop_back();
|
|
} else {
|
|
packet = new Buffer(bytes, default_size_);
|
|
}
|
|
|
|
packet->SetData(static_cast<const uint8_t*>(buffer), bytes);
|
|
if (bytes_written) {
|
|
*bytes_written = bytes;
|
|
}
|
|
queue_.push_back(packet);
|
|
if (!was_readable) {
|
|
NotifyReadableForTest();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace rtc
|