Bug 1788173 - Force IPC channel error on timeout waiting for client connection r=ipc-reviewers,jld

Differential Revision: https://phabricator.services.mozilla.com/D173585
This commit is contained in:
Alexandre Lissy 2023-04-06 08:04:29 +00:00
parent 4c61d223e2
commit 4ca7ebefd5
2 changed files with 24 additions and 0 deletions

View file

@ -115,6 +115,11 @@ void Channel::ChannelImpl::Close() {
void Channel::ChannelImpl::CloseLocked() {
chan_cap_.NoteExclusiveAccess();
if (connect_timeout_) {
connect_timeout_->Cancel();
connect_timeout_ = nullptr;
}
// If we still have pending I/O, cancel it. The references inside
// `input_state_` and `output_state_` will keep the buffers alive until they
// complete.
@ -316,9 +321,23 @@ bool Channel::ChannelImpl::ProcessConnection() {
switch (err) {
case ERROR_IO_PENDING:
input_state_.is_pending = this;
NS_NewTimerWithCallback(
getter_AddRefs(connect_timeout_),
[self = RefPtr{this}](nsITimer* timer) {
CHROMIUM_LOG(ERROR) << "ConnectNamedPipe timed out!";
self->IOThread().AssertOnCurrentThread();
self->Close();
self->listener_->OnChannelError();
},
10000, nsITimer::TYPE_ONE_SHOT, "ChannelImpl::ProcessConnection",
IOThread().GetEventTarget());
break;
case ERROR_PIPE_CONNECTED:
waiting_connect_ = false;
if (connect_timeout_) {
connect_timeout_->Cancel();
connect_timeout_ = nullptr;
}
break;
case ERROR_NO_DATA:
// The pipe is being closed.

View file

@ -155,6 +155,11 @@ class Channel::ChannelImpl : public MessageLoopForIO::IOHandler {
// buffers of this message.
mozilla::UniquePtr<Message> incoming_message_ MOZ_GUARDED_BY(IOThread());
// Timer started when a MODE_SERVER channel begins waiting for a connection,
// and cancelled when the connection completes. Will produce an error if no
// connection occurs before the timeout.
nsCOMPtr<nsITimer> connect_timeout_ MOZ_GUARDED_BY(IOThread());
// Will be set to `true` until `Connect()` has been called, and, if in
// server-mode, the client has connected. The `input_state_` is used to wait
// for the client to connect in overlapped mode.