From 7be90ae244a1a673eee5ae8d8e88e2d946fa223a Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Fri, 13 Apr 2012 13:48:56 -0400 Subject: [PATCH] Close server-related file descriptors before executing child process Closes #170 github issue. --- src/frontend/mosh-server.cc | 11 ++++++++--- src/network/network.cc | 23 +++++------------------ src/network/network.h | 3 ++- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index 0b2773d..cf9dfe9 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -227,11 +227,11 @@ int run_server( const char *desired_ip, const char *desired_port, /* open network */ Network::UserStream blank; - ServerConnection network( terminal, blank, desired_ip, desired_port ); + ServerConnection *network = new ServerConnection( terminal, blank, desired_ip, desired_port ); /* network.set_verbose(); */ - printf( "\nMOSH CONNECT %d %s\n", network.port(), network.get_key().c_str() ); + printf( "\nMOSH CONNECT %d %s\n", network->port(), network->get_key().c_str() ); fflush( stdout ); /* don't let signals kill us */ @@ -294,6 +294,9 @@ int run_server( const char *desired_ip, const char *desired_port, fatal_assert( sigemptyset( &signals_to_block ) == 0 ); fatal_assert( sigprocmask( SIG_SETMASK, &signals_to_block, NULL ) == 0 ); + /* close server-related file descriptors */ + delete network; + /* set TERM */ const char default_term[] = "xterm"; const char color_term[] = "xterm-256color"; @@ -337,7 +340,7 @@ int run_server( const char *desired_ip, const char *desired_port, #endif try { - serve( master, terminal, network ); + serve( master, terminal, *network ); } catch ( Network::NetworkException e ) { fprintf( stderr, "Network exception: %s: %s\n", e.function.c_str(), strerror( e.the_errno ) ); @@ -351,6 +354,8 @@ int run_server( const char *desired_ip, const char *desired_port, exit( 1 ); } + delete network; + #ifdef HAVE_UTEMPTER utempter_remove_added_record(); #endif diff --git a/src/network/network.cc b/src/network/network.cc index a86b9dc..52a09f6 100644 --- a/src/network/network.cc +++ b/src/network/network.cc @@ -427,22 +427,9 @@ uint64_t Connection::timeout( void ) const return RTO; } -class Socket { -public: - int fd; - - Socket( int domain, int type, int protocol ) - : fd( socket( domain, type, protocol ) ) - { - if ( fd < 0 ) { - throw NetworkException( "socket", errno ); - } +Connection::~Connection() +{ + if ( close( sock ) < 0 ) { + throw NetworkException( "close", errno ); } - - ~Socket() - { - if ( close( fd ) < 0 ) { - throw NetworkException( "close", errno ); - } - } -}; +} diff --git a/src/network/network.h b/src/network/network.h index dd9d79b..347a53b 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -107,7 +107,8 @@ namespace Network { public: Connection( const char *desired_ip, const char *desired_port ); /* server */ Connection( const char *key_str, const char *ip, int port ); /* client */ - + ~Connection(); + void send( string s ); string recv( void ); int fd( void ) const { return sock; }