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:
Peter A. Bigot 2018-04-24 14:50:31 -05:00
parent e665916b85
commit adf4fb3bc1
1 changed files with 6 additions and 4 deletions

View File

@ -194,7 +194,7 @@ public:
* Proceed to the next state * Proceed to the next state
* @return TcpState * * @return TcpState *
*/ */
TcpState *proceed() TcpState *proceed(const Monitor &monitor)
{ {
// do we have a valid socket? // do we have a valid socket?
if (_socket >= 0) if (_socket >= 0)
@ -211,6 +211,9 @@ public:
// report error // report error
_handler->onError(_connection, _error.data()); _handler->onError(_connection, _error.data());
// handler callback might have destroyed connection
if (!monitor.valid()) return nullptr;
// create dummy implementation // create dummy implementation
return new TcpClosed(_connection, _handler); return new TcpClosed(_connection, _handler);
} }
@ -229,7 +232,7 @@ public:
if (fd != _pipe.in() || !(flags & readable)) return this; if (fd != _pipe.in() || !(flags & readable)) return this;
// proceed to the next state // proceed to the next state
return proceed(); return proceed(monitor);
} }
/** /**
@ -243,7 +246,7 @@ public:
_thread.join(); _thread.join();
// proceed to the next state // proceed to the next state
return proceed(); return proceed(monitor);
} }
/** /**
@ -262,4 +265,3 @@ public:
* End of namespace * End of namespace
*/ */
} }