TcpResolver: reduce risk of accessing destructed TcpConnection
Invoking TcpHandler::onError might result in the connection being destroyed. Though the reference to it in TcpClosed() is likely benign, it's safer to follow the standard practice of returning a nullptr to indicate that the connection is known to be destroyed.
This commit is contained in:
parent
e665916b85
commit
adf4fb3bc1
|
|
@ -194,7 +194,7 @@ public:
|
|||
* Proceed to the next state
|
||||
* @return TcpState *
|
||||
*/
|
||||
TcpState *proceed()
|
||||
TcpState *proceed(const Monitor &monitor)
|
||||
{
|
||||
// do we have a valid socket?
|
||||
if (_socket >= 0)
|
||||
|
|
@ -211,6 +211,9 @@ public:
|
|||
// report error
|
||||
_handler->onError(_connection, _error.data());
|
||||
|
||||
// handler callback might have destroyed connection
|
||||
if (!monitor.valid()) return nullptr;
|
||||
|
||||
// create dummy implementation
|
||||
return new TcpClosed(_connection, _handler);
|
||||
}
|
||||
|
|
@ -229,7 +232,7 @@ public:
|
|||
if (fd != _pipe.in() || !(flags & readable)) return this;
|
||||
|
||||
// proceed to the next state
|
||||
return proceed();
|
||||
return proceed(monitor);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -243,7 +246,7 @@ public:
|
|||
_thread.join();
|
||||
|
||||
// proceed to the next state
|
||||
return proceed();
|
||||
return proceed(monitor);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -262,4 +265,3 @@ public:
|
|||
* End of namespace
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue