mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 09:04:13 +00:00
Better handling of stream events while in a TLS handshake
This commit is contained in:
parent
cc50c639ae
commit
d704846c6f
4 changed files with 42 additions and 41 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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 )
|
||||
*/
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue