summaryrefslogtreecommitdiff
path: root/cpp/src
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
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')
-rw-r--r--cpp/src/Ice/ios/StreamTransceiver.cpp85
-rw-r--r--cpp/src/Ice/ios/StreamTransceiver.h2
-rw-r--r--cpp/src/IceIAP/Transceiver.h2
-rw-r--r--cpp/src/IceIAP/Transceiver.mm69
4 files changed, 62 insertions, 96 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;
}
diff --git a/cpp/src/Ice/ios/StreamTransceiver.h b/cpp/src/Ice/ios/StreamTransceiver.h
index 478691a554a..c7c6621c686 100644
--- a/cpp/src/Ice/ios/StreamTransceiver.h
+++ b/cpp/src/Ice/ios/StreamTransceiver.h
@@ -69,7 +69,7 @@ public:
private:
- void checkError(CFErrorRef, const char*, int);
+ void checkErrorStatus(CFWriteStreamRef, CFReadStreamRef, const char*, int);
const InstancePtr _instance;
const std::string _host;
diff --git a/cpp/src/IceIAP/Transceiver.h b/cpp/src/IceIAP/Transceiver.h
index 61300b61c44..2fa47f41d7c 100644
--- a/cpp/src/IceIAP/Transceiver.h
+++ b/cpp/src/IceIAP/Transceiver.h
@@ -60,7 +60,7 @@ public:
private:
- void checkError(NSError*, const char*, int);
+ void checkErrorStatus(NSStream*, const char*, int);
IceInternal::ProtocolInstancePtr _instance;
EASession* _session;
diff --git a/cpp/src/IceIAP/Transceiver.mm b/cpp/src/IceIAP/Transceiver.mm
index 2bc30f211a5..68310c83f68 100644
--- a/cpp/src/IceIAP/Transceiver.mm
+++ b/cpp/src/IceIAP/Transceiver.mm
@@ -236,16 +236,8 @@ IceObjC::iAPTransceiver::initialize(Buffer& readBuffer, Buffer& writeBuffer)
{
if(_error)
{
- NSError* err = nil;
- if([_writeStream streamStatus] == NSStreamStatusError)
- {
- err = [_writeStream streamError];
- }
- if([_readStream streamStatus] == NSStreamStatusError)
- {
- err = [_readStream streamError];
- }
- checkError(err, __FILE__, __LINE__);
+ checkErrorStatus(_writeStream, __FILE__, __LINE__);
+ checkErrorStatus(_readStream, __FILE__, __LINE__);
}
_state = StateConnected;
}
@@ -272,12 +264,10 @@ IceObjC::iAPTransceiver::write(Buffer& buf)
IceUtil::Mutex::Lock sync(_mutex);
if(_error)
{
- assert([_writeStream streamStatus] == NSStreamStatusError);
- checkError([_writeStream streamError], __FILE__, __LINE__);
+ checkErrorStatus(_writeStream, __FILE__, __LINE__);
}
- // Its impossible for the packetSize to be more than an Int.
- int packetSize = static_cast<int>(buf.b.end() - buf.i);
+ size_t packetSize = buf.b.end() - buf.i;
while(buf.i != buf.b.end())
{
if(![_writeStream hasSpaceAvailable])
@@ -289,15 +279,7 @@ IceObjC::iAPTransceiver::write(Buffer& buf)
NSInteger ret = [_writeStream write:reinterpret_cast<const UInt8*>(&*buf.i) maxLength:packetSize];
if(ret == SOCKET_ERROR)
{
- if([_writeStream streamStatus] == NSStreamStatusAtEnd)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-
- assert([_writeStream streamStatus] == NSStreamStatusError);
- checkError([_writeStream streamError], __FILE__, __LINE__);
+ checkErrorStatus(_writeStream, __FILE__, __LINE__);
if(noBuffers() && packetSize > 1024)
{
packetSize /= 2;
@@ -309,7 +291,7 @@ IceObjC::iAPTransceiver::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;
}
}
@@ -322,12 +304,10 @@ IceObjC::iAPTransceiver::read(Buffer& buf)
IceUtil::Mutex::Lock sync(_mutex);
if(_error)
{
- assert([_readStream streamStatus] == NSStreamStatusError);
- checkError([_readStream streamError], __FILE__, __LINE__);
+ checkErrorStatus(_readStream, __FILE__, __LINE__);
}
- // Its impossible for the packetSize to be more than an Int.
- int packetSize = static_cast<int>(buf.b.end() - buf.i);
+ size_t packetSize = buf.b.end() - buf.i;
while(buf.i != buf.b.end())
{
if(![_readStream hasBytesAvailable] && [_readStream streamStatus] != NSStreamStatusError)
@@ -339,22 +319,12 @@ IceObjC::iAPTransceiver::read(Buffer& buf)
NSInteger ret = [_readStream read:reinterpret_cast<UInt8*>(&*buf.i) maxLength:packetSize];
if(ret == 0)
{
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = 0;
- throw ex;
+ throw ConnectionLostException(__FILE__, __LINE__);
}
if(ret == SOCKET_ERROR)
{
- if([_readStream streamStatus] == NSStreamStatusAtEnd)
- {
- ConnectionLostException ex(__FILE__, __LINE__);
- ex.error = getSocketErrno();
- throw ex;
- }
-
- assert([_readStream streamStatus] == NSStreamStatusError);
- checkError([_readStream streamError], __FILE__, __LINE__);
+ checkErrorStatus(_readStream, __FILE__, __LINE__);
if(noBuffers() && packetSize > 1024)
{
packetSize /= 2;
@@ -366,7 +336,7 @@ IceObjC::iAPTransceiver::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;
}
}
@@ -437,14 +407,27 @@ IceObjC::iAPTransceiver::~iAPTransceiver()
}
void
-IceObjC::iAPTransceiver::checkError(NSError* err, const char* file, int line)
+IceObjC::iAPTransceiver::checkErrorStatus(NSStream* stream, const char* file, int line)
{
+ NSStreamStatus status = [stream streamStatus];
+ if(status == NSStreamStatusAtEnd)
+ {
+ throw ConnectionLostException(file, line);
+ }
+
+ assert(status == NSStreamStatusError);
+
+ NSError* err = [stream streamError];
NSString* domain = [err domain];
if([domain compare:NSPOSIXErrorDomain] == NSOrderedSame)
{
errno = [err code];
[err release];
- if(connectionRefused())
+ if(interrupted() || noBuffers())
+ {
+ return;
+ }
+ else if(connectionRefused())
{
ConnectionRefusedException ex(file, line);
ex.error = getSocketErrno();