Better handling of stream events while in a TLS handshake

This commit is contained in:
Wolfgang Lux 2019-10-29 11:18:33 +01:00
parent cc50c639ae
commit d704846c6f
4 changed files with 42 additions and 41 deletions

View file

@ -1,5 +1,11 @@
2019-10-29 Wolfgang Lux <wolfgang.lux@gmail.com>
* Source/GSStream.h,
* Source/GSStream.m,
* Source/GSSocketStream.m:
Use a more sane implementation to redirect event handling to the
TLS handler while in a handshake.
* Source/GSTLS.m:
Fall back to a sane default if the TLS priority setting is invalid.

View file

@ -1584,26 +1584,7 @@ setNonBlocking(SOCKET fd)
*/
if (_handler != nil && [_handler handshake] == YES)
{
id hdl = _handler;
id del = _delegate;
BOOL val = _delegateValid;
/* Retain self to prevent a dangling pointer the handler closes and
* releases this socket. Also, do not restore the old delegate if it
* was changed directly or indirectly by the handler.
* FIXME We leave the socket an inconsistent state if any exception
* is raised in _sendEvent:.
*/
RETAIN(self);
_delegate = hdl;
_delegateValid = YES;
[super _sendEvent: event];
if (_delegate == hdl)
{
_delegate = del;
_delegateValid = val;
}
RELEASE(self);
[super _sendEvent: event delegate: _handler];
}
else
{

View file

@ -130,6 +130,11 @@ IVARS
*/
- (void) _sendEvent: (NSStreamEvent)event;
/**
* send an event to delegate
*/
- (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate;
/**
* setter for IO event reference (file descriptor, file handle etc )
*/

View file

@ -392,6 +392,10 @@ static RunLoopEventType typeForStream(NSStream *aStream)
{
}
- (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate
{
}
- (void) _setLoopID: (void *)ref
{
}
@ -505,6 +509,11 @@ static RunLoopEventType typeForStream(NSStream *aStream)
}
- (void) _sendEvent: (NSStreamEvent)event
{
[self _sendEvent: event delegate: _delegateValid == YES ? _delegate : nil];
}
- (void) _sendEvent: (NSStreamEvent)event delegate: (id)delegate
{
if (event == NSStreamEventNone)
{
@ -515,10 +524,10 @@ static RunLoopEventType typeForStream(NSStream *aStream)
if ((_events & event) == 0)
{
_events |= NSStreamEventOpenCompleted;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
[delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
}
}
}
@ -527,19 +536,19 @@ static RunLoopEventType typeForStream(NSStream *aStream)
if ((_events & NSStreamEventOpenCompleted) == 0)
{
_events |= NSStreamEventOpenCompleted;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
[delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
}
}
if ((_events & NSStreamEventHasBytesAvailable) == 0)
{
_events |= NSStreamEventHasBytesAvailable;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventHasBytesAvailable];
[delegate stream: self
handleEvent: NSStreamEventHasBytesAvailable];
}
}
}
@ -548,19 +557,19 @@ static RunLoopEventType typeForStream(NSStream *aStream)
if ((_events & NSStreamEventOpenCompleted) == 0)
{
_events |= NSStreamEventOpenCompleted;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
[delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
}
}
if ((_events & NSStreamEventHasSpaceAvailable) == 0)
{
_events |= NSStreamEventHasSpaceAvailable;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventHasSpaceAvailable];
[delegate stream: self
handleEvent: NSStreamEventHasSpaceAvailable];
}
}
}
@ -569,10 +578,10 @@ static RunLoopEventType typeForStream(NSStream *aStream)
if ((_events & NSStreamEventErrorOccurred) == 0)
{
_events |= NSStreamEventErrorOccurred;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventErrorOccurred];
[delegate stream: self
handleEvent: NSStreamEventErrorOccurred];
}
}
}
@ -581,10 +590,10 @@ static RunLoopEventType typeForStream(NSStream *aStream)
if ((_events & NSStreamEventEndEncountered) == 0)
{
_events |= NSStreamEventEndEncountered;
if (_delegateValid == YES)
if (delegate != nil)
{
[_delegate stream: self
handleEvent: NSStreamEventEndEncountered];
[delegate stream: self
handleEvent: NSStreamEventEndEncountered];
}
}
}