diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-04-28 17:30:17 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-04-28 17:30:17 +0200 |
commit | 8c87a17030ec21ff968f3ec7c44ba844e5afdaaf (patch) | |
tree | 0d896cd16f4e50e83615b971522674b1f07c28d1 /cpp/src | |
parent | Fixed ICE-7841 - IceStorm/stress failure (diff) | |
download | ice-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.cpp | 85 | ||||
-rw-r--r-- | cpp/src/Ice/ios/StreamTransceiver.h | 2 | ||||
-rw-r--r-- | cpp/src/IceIAP/Transceiver.h | 2 | ||||
-rw-r--r-- | cpp/src/IceIAP/Transceiver.mm | 69 |
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(); |