From 9cade23616351c02cf001690901979f6aa8d5736 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 11 Aug 2012 23:13:54 +0300 Subject: [PATCH] It's safer to close stdin/out/err by replacing their fd with /dev/null. Otherwise the next opened fds are 0/1/2, and any code writing to stdout/stderr might break things by writing to an unintentional fd. Signed-off-by: Timo Sirainen --- src/frontend/mosh-server.cc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index 4530ebf..b37a21c 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -391,9 +392,20 @@ int run_server( const char *desired_ip, const char *desired_port, /* close file descriptors */ if ( !verbose ) { /* Necessary to properly detach on old versions of sshd (e.g. RHEL/CentOS 5.0). */ - fclose( stdin ); - fclose( stdout ); - fclose( stderr ); + int nullfd; + + nullfd = open( "/dev/null", O_RDWR ); + if ( nullfd == -1 ) { + perror( "dup2" ); + exit( 1 ); + } + + if ( dup2 ( nullfd, STDIN_FILENO ) < 0 || + dup2 ( nullfd, STDOUT_FILENO ) < 0 || + dup2 ( nullfd, STDERR_FILENO ) < 0 ) { + perror( "dup2" ); + exit( 1 ); + } } char utmp_entry[ 64 ] = { 0 };