summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ios/StreamTransceiver.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-04-28 17:30:17 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-04-28 17:30:17 +0200
commit8c87a17030ec21ff968f3ec7c44ba844e5afdaaf (patch)
tree0d896cd16f4e50e83615b971522674b1f07c28d1 /cpp/src/Ice/ios/StreamTransceiver.cpp
parentFixed ICE-7841 - IceStorm/stress failure (diff)
downloadice-8c87a17030ec21ff968f3ec7c44ba844e5afdaaf.tar.bz2
ice-8c87a17030ec21ff968f3ec7c44ba844e5afdaaf.tar.xz
ice-8c87a17030ec21ff968f3ec7c44ba844e5afdaaf.zip
Fixed ICE-7843 - Check NSStreamStatusAtEnd in iOS transports
Diffstat (limited to 'cpp/src/Ice/ios/StreamTransceiver.cpp')
-rw-r--r--cpp/src/Ice/ios/StreamTransceiver.cpp85
1 files changed, 34 insertions, 51 deletions
diff --git a/cpp/src/Ice/ios/StreamTransceiver.cpp b/cpp/src/Ice/ios/StreamTransceiver.cpp
index 06796d70480..cbdde8e25ab 100644
--- a/cpp/src/Ice/ios/StreamTransceiver.cpp
+++ b/cpp/src/Ice/ios/StreamTransceiver.cpp
@@ -240,16 +240,7 @@ IceObjC::StreamTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer)
{
if(_error)
{
- UniqueRef<CFErrorRef> err;
- if(CFWriteStreamGetStatus(_writeStream.get()) == kCFStreamStatusError)
- {
- err.reset(CFWriteStreamCopyError(_writeStream.get()));
- }
- else if(CFReadStreamGetStatus(_readStream.get()) == kCFStreamStatusError)
- {
- err.reset(CFReadStreamCopyError(_readStream.get()));
- }
- checkError(err.get(), __FILE__, __LINE__);
+ checkErrorStatus(_writeStream.get(), _readStream.get(), __FILE__, __LINE__);
}
_state = StateConnected;
@@ -327,13 +318,10 @@ IceObjC::StreamTransceiver::write(Buffer& buf)
IceUtil::Mutex::Lock sync(_mutex);
if(_error)
{
- assert(CFWriteStreamGetStatus(_writeStream.get()) == kCFStreamStatusError);
- UniqueRef<CFErrorRef> err(CFWriteStreamCopyError(_writeStream.get()));
- checkError(err.get(), __FILE__, __LINE__);
+ checkErrorStatus(_writeStream.get(), 0, __FILE__, __LINE__);
}
- // Its impossible for the packetSize to be more than an Int.
- size_t packetSize = static_cast<size_t>(buf.b.end() - buf.i);
+ size_t packetSize = buf.b.end() - buf.i;
while(buf.i != buf.b.end())
{
if(!CFWriteStreamCanAcceptBytes(_writeStream.get()))
@@ -346,16 +334,7 @@ IceObjC::StreamTransceiver::write(Buffer& buf)
if(ret == SOCKET_ERROR)
{
- if(CFWriteStreamGetStatus(_writeStream.get()) == kCFStreamStatusAtEnd)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-
- assert(CFWriteStreamGetStatus(_writeStream.get()) == kCFStreamStatusError);
- UniqueRef<CFErrorRef> err(CFWriteStreamCopyError(_writeStream.get()));
- checkError(err.get(), __FILE__, __LINE__);
+ checkErrorStatus(_writeStream.get(), 0, __FILE__, __LINE__);
if(noBuffers() && packetSize > 1024)
{
packetSize /= 2;
@@ -367,7 +346,7 @@ IceObjC::StreamTransceiver::write(Buffer& buf)
if(packetSize > buf.b.end() - buf.i)
{
- packetSize = static_cast<int>(buf.b.end() - buf.i);
+ packetSize = buf.b.end() - buf.i;
}
}
return SocketOperationNone;
@@ -379,13 +358,10 @@ IceObjC::StreamTransceiver::read(Buffer& buf)
IceUtil::Mutex::Lock sync(_mutex);
if(_error)
{
- assert(CFReadStreamGetStatus(_readStream.get()) == kCFStreamStatusError);
- UniqueRef<CFErrorRef> err(CFReadStreamCopyError(_readStream.get()));
- checkError(err.get(), __FILE__, __LINE__);
+ checkErrorStatus(0, _readStream.get(), __FILE__, __LINE__);
}
- // Its impossible for the packetSize to be more than an Int.
- size_t packetSize = static_cast<size_t>(buf.b.end() - buf.i);
+ size_t packetSize = buf.b.end() - buf.i;
while(buf.i != buf.b.end())
{
if(!CFReadStreamHasBytesAvailable(_readStream.get()))
@@ -405,16 +381,7 @@ IceObjC::StreamTransceiver::read(Buffer& buf)
if(ret == SOCKET_ERROR)
{
- if(CFReadStreamGetStatus(_readStream.get()) == kCFStreamStatusAtEnd)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-
- assert(CFReadStreamGetStatus(_readStream.get()) == kCFStreamStatusError);
- UniqueRef<CFErrorRef> err(CFReadStreamCopyError(_readStream.get()));
- checkError(err.get(), __FILE__, __LINE__);
+ checkErrorStatus(0, _readStream.get(), __FILE__, __LINE__);
if(noBuffers() && packetSize > 1024)
{
packetSize /= 2;
@@ -426,7 +393,7 @@ IceObjC::StreamTransceiver::read(Buffer& buf)
if(packetSize > buf.b.end() - buf.i)
{
- packetSize = static_cast<int>(buf.b.end() - buf.i);
+ packetSize = buf.b.end() - buf.i;
}
}
@@ -524,19 +491,35 @@ IceObjC::StreamTransceiver::~StreamTransceiver()
}
void
-IceObjC::StreamTransceiver::checkError(CFErrorRef err, const char* file, int line)
+IceObjC::StreamTransceiver::checkErrorStatus(CFWriteStreamRef writeStream, CFReadStreamRef readStream,
+ const char* file, int line)
{
- assert(err);
- CFStringRef domain = CFErrorGetDomain(err);
+ if((writeStream && (CFWriteStreamGetStatus(writeStream) == kCFStreamStatusAtEnd)) ||
+ (readStream && (CFReadStreamGetStatus(readStream) == kCFStreamStatusAtEnd)))
+ {
+ throw ConnectionLostException(file, line);
+ }
+
+ UniqueRef<CFErrorRef> err;
+ if(writeStream && CFWriteStreamGetStatus(writeStream) == kCFStreamStatusError)
+ {
+ err.reset(CFWriteStreamCopyError(writeStream));
+ }
+ else if(readStream && CFReadStreamGetStatus(readStream) == kCFStreamStatusError)
+ {
+ err.reset(CFReadStreamCopyError(readStream));
+ }
+
+ assert(err.get());
+ CFStringRef domain = CFErrorGetDomain(err.get());
if(CFStringCompare(domain, kCFErrorDomainPOSIX, 0) == kCFCompareEqualTo)
{
- errno = CFErrorGetCode(err);
+ errno = CFErrorGetCode(err.get());
if(interrupted() || noBuffers())
{
return;
}
-
- if(connectionLost())
+ else if(connectionLost())
{
ConnectionLostException ex(file, line);
ex.error = getSocketErrno();
@@ -562,13 +545,13 @@ IceObjC::StreamTransceiver::checkError(CFErrorRef err, const char* file, int lin
}
}
- int error = CFErrorGetCode(err);
+ int error = CFErrorGetCode(err.get());
if(error == kCFHostErrorHostNotFound || error == kCFHostErrorUnknown)
{
int rs = 0;
if(error == kCFHostErrorUnknown)
{
- UniqueRef<CFDictionaryRef> dict(CFErrorCopyUserInfo(err));
+ UniqueRef<CFDictionaryRef> dict(CFErrorCopyUserInfo(err.get()));
CFNumberRef d = static_cast<CFNumberRef>(CFDictionaryGetValue(dict.get(), kCFGetAddrInfoFailureKey));
if(d != 0)
{
@@ -583,6 +566,6 @@ IceObjC::StreamTransceiver::checkError(CFErrorRef err, const char* file, int lin
CFNetworkException ex(file, line);
ex.domain = fromCFString(domain);
- ex.error = CFErrorGetCode(err);
+ ex.error = CFErrorGetCode(err.get());
throw ex;
}