From c073ad364afd0e883442382b3da9f9aeee2c5701 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Thu, 26 Jul 2012 22:54:45 -0400 Subject: [PATCH] get_SSH_IP gracefully handles missing, IPv6-formatted environment var Closes #292 github issue. --- configure.ac | 2 +- src/frontend/mosh-server.cc | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 5f5fc0b..40f41d8 100644 --- a/configure.ac +++ b/configure.ac @@ -195,7 +195,7 @@ AC_TYPE_UINTPTR_T # Checks for library functions. AC_FUNC_FORK AC_FUNC_MBRTOWC -AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo posix_memalign setenv setlocale sigaction socket strchr strdup strerror strtol wcwidth]) +AC_CHECK_FUNCS([gettimeofday setrlimit inet_ntoa iswprint memchr memset nl_langinfo posix_memalign setenv setlocale sigaction socket strchr strdup strncasecmp strtok strerror strtol wcwidth]) AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Define if clock_gettime is available.])]) diff --git a/src/frontend/mosh-server.cc b/src/frontend/mosh-server.cc index 2c4df57..9aa69d4 100644 --- a/src/frontend/mosh-server.cc +++ b/src/frontend/mosh-server.cc @@ -122,13 +122,29 @@ void spin( void ) string get_SSH_IP( void ) { const char *SSH_CONNECTION = getenv( "SSH_CONNECTION" ); - fatal_assert( SSH_CONNECTION ); + if ( !SSH_CONNECTION ) { /* Older sshds don't set this */ + fprintf( stderr, "Warning: SSH_CONNECTION not found; binding to any interface.\n" ); + return string( "0.0.0.0" ); + } char *SSH_writable = strdup( SSH_CONNECTION ); fatal_assert( SSH_writable ); + strtok( SSH_writable, " " ); strtok( NULL, " " ); const char *local_interface_IP = strtok( NULL, " " ); - fatal_assert( local_interface_IP ); + if ( !local_interface_IP ) { + fprintf( stderr, "Warning: Could not parse SSH_CONNECTION; binding to any interface.\n" ); + return string( "0.0.0.0" ); + } + + /* Strip IPv6 prefix. */ + const char IPv6_prefix[] = "::ffff:"; + + if ( ( strlen( local_interface_IP ) > strlen( IPv6_prefix ) ) + && ( 0 == strncasecmp( local_interface_IP, IPv6_prefix, strlen( IPv6_prefix ) ) ) ) { + return string( local_interface_IP + strlen( IPv6_prefix ) ); + } + return string( local_interface_IP ); }