From d17fb7824b96ab2fab9a7504cb739c0710974239 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Fri, 5 Oct 2012 00:06:37 -0400 Subject: [PATCH] Reset fd sets every time we poll (because network.fd() can now change) --- src/frontend/mosh-server.cc | 7 +++++-- src/frontend/stmclient.cc | 8 ++++++-- src/util/select.h | 5 +++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index 97e6521..b118daa 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -510,8 +510,6 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network { /* prepare to poll for events */ Select &sel = Select::get_instance(); - sel.add_fd( network.fd() ); - sel.add_fd( host_fd ); sel.add_signal( SIGTERM ); sel.add_signal( SIGINT ); @@ -534,6 +532,11 @@ void serve( int host_fd, Terminal::Complete &terminal, ServerConnection &network timeout = min( timeout, timeout_if_no_client ); } + /* poll for events */ + sel.clear_fds(); + sel.add_fd( network.fd() ); + sel.add_fd( host_fd ); + int active_fds = sel.select( timeout ); if ( active_fds < 0 ) { perror( "select" ); diff --git a/src/frontend/stmclient.cc b/src/frontend/stmclient.cc index 2b69f7b..18c9dbe 100644 --- a/src/frontend/stmclient.cc +++ b/src/frontend/stmclient.cc @@ -309,8 +309,6 @@ void STMClient::main( void ) /* prepare to poll for events */ Select &sel = Select::get_instance(); - sel.add_fd( network->fd() ); - sel.add_fd( STDIN_FILENO ); while ( 1 ) { try { @@ -323,6 +321,12 @@ void STMClient::main( void ) wait_time = min( 250, wait_time ); } + /* poll for events */ + /* network->fd() can in theory change over time */ + sel.clear_fds(); + sel.add_fd( network->fd() ); + sel.add_fd( STDIN_FILENO ); + int active_fds = sel.select( wait_time ); if ( active_fds < 0 ) { perror( "select" ); diff --git a/src/util/select.h b/src/util/select.h index a0168e3..dc06716 100644 --- a/src/util/select.h +++ b/src/util/select.h @@ -93,6 +93,11 @@ public: FD_SET( fd, &all_fds ); } + void clear_fds( void ) + { + FD_ZERO( &all_fds ); + } + void add_signal( int signum ) { fatal_assert( signum >= 0 );