summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ConnectionI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/ConnectionI.cpp')
-rw-r--r--cpp/src/Ice/ConnectionI.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp
index 310f4575395..50d922be521 100644
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -423,6 +423,12 @@ Ice::ConnectionI::sendRequest(Outgoing* out, bool compress, bool response)
assert(_state > StateNotValidated);
assert(_state < StateClosing);
+ //
+ // Ensure the message isn't bigger than what we can send with the
+ // transport.
+ //
+ _transceiver->checkSendSize(*os, _instance->messageSizeMax());
+
Int requestId;
if(response)
{
@@ -494,6 +500,12 @@ Ice::ConnectionI::sendAsyncRequest(const OutgoingAsyncPtr& out, bool compress, b
assert(_state > StateNotValidated);
assert(_state < StateClosing);
+ //
+ // Ensure the message isn't bigger than what we can send with the
+ // transport.
+ //
+ _transceiver->checkSendSize(*os, _instance->messageSizeMax());
+
Int requestId;
if(response)
{
@@ -1099,13 +1111,14 @@ Ice::ConnectionI::message(ThreadPoolCurrent& current)
}
if(current.operation & SocketOperationRead && !_readStream.b.empty())
{
- if(static_cast<Int>(_readStream.b.size()) == headerSize) // Read header.
+ if(_readHeader) // Read header if necessary.
{
if(_readStream.i != _readStream.b.end() && !_transceiver->read(_readStream))
{
return;
}
assert(_readStream.i == _readStream.b.end());
+ _readHeader = false;
ptrdiff_t pos = _readStream.i - _readStream.b.begin();
if(pos < headerSize)
@@ -1173,18 +1186,12 @@ Ice::ConnectionI::message(ThreadPoolCurrent& current)
}
_readStream.i = _readStream.b.begin() + pos;
}
-
+
if(_readStream.i != _readStream.b.end())
{
if(_endpoint->datagram())
{
- if(_warnUdp)
- {
- Warning out(_instance->initializationData().logger);
- out << "DatagramLimitException: maximum size of " << _readStream.i - _readStream.b.begin()
- << " exceeded";
- }
- throw DatagramLimitException(__FILE__, __LINE__);
+ throw DatagramLimitException(__FILE__, __LINE__); // The message was truncated.
}
else
{
@@ -1236,8 +1243,14 @@ Ice::ConnectionI::message(ThreadPoolCurrent& current)
}
catch(const DatagramLimitException&) // Expected.
{
+ if(_warnUdp)
+ {
+ Warning out(_instance->initializationData().logger);
+ out << "maximum datagram size of " << _readStream.i - _readStream.b.begin() << " exceeded";
+ }
_readStream.resize(headerSize);
_readStream.i = _readStream.b.begin();
+ _readHeader = true;
return;
}
catch(const SocketException& ex)
@@ -1249,13 +1262,14 @@ Ice::ConnectionI::message(ThreadPoolCurrent& current)
{
if(_endpoint->datagram())
{
- if(_instance->initializationData().properties->getPropertyAsInt("Ice.Warn.Connections") > 0)
+ if(_warn)
{
Warning out(_instance->initializationData().logger);
out << "datagram connection exception:\n" << ex << '\n' << _desc;
}
_readStream.resize(headerSize);
_readStream.i = _readStream.b.begin();
+ _readHeader = true;
}
else
{
@@ -1517,6 +1531,7 @@ Ice::ConnectionI::ConnectionI(const InstancePtr& instance,
_batchRequestCompress(false),
_batchMarker(0),
_readStream(_instance.get()),
+ _readHeader(false),
_writeStream(_instance.get()),
_dispatchCount(0),
_state(StateNotInitialized)
@@ -1973,6 +1988,7 @@ Ice::ConnectionI::validate(SocketOperation operation)
_readStream.resize(headerSize);
_readStream.i = _readStream.b.begin();
+ _readHeader = true;
return true;
}
@@ -2370,6 +2386,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request
_readStream.swap(stream);
_readStream.resize(headerSize);
_readStream.i = _readStream.b.begin();
+ _readHeader = true;
assert(stream.i == stream.b.end());