diff options
| author | jackpoz <giacomopoz@gmail.com> | 2014-12-27 00:10:01 +0100 |
|---|---|---|
| committer | jackpoz <giacomopoz@gmail.com> | 2014-12-27 14:03:54 +0100 |
| commit | cdf6c884624be33b5782bcca0e206e5c291a517b (patch) | |
| tree | 0ceb56639c696ef0d345fbd1bf0747533bc9be25 | |
| parent | 3747f99d4f76a149d215745780703b2623c59425 (diff) | |
Shared/Networking: Fix buffer overflow in Socket handling
Fix a buffer overflow caused by Boost trying to store too much data in a buffer too small.
| -rw-r--r-- | src/server/shared/Networking/MessageBuffer.h | 8 | ||||
| -rw-r--r-- | src/server/shared/Networking/Socket.h | 3 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index 2dcd4fbc161..a214af9d127 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -81,6 +81,14 @@ public: } } + // Ensures there's "some" free space, make sure to call Normalize() before this + void EnsureFreeSpace() + { + // Double the size of the buffer if it's already full + if (GetRemainingSpace() == 0) + _storage.resize(_storage.size() * 2); + } + void Write(void const* data, std::size_t size) { if (size) diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index d3e29ceaaea..b4f1692aeb2 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -90,7 +90,8 @@ public: return; _readBuffer.Normalize(); - _socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), READ_BLOCK_SIZE), + _readBuffer.EnsureFreeSpace(); + _socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), _readBuffer.GetRemainingSpace()), std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } |
