From 4bda2a6fb366e227d31cd4ba74a4970ff7afcc15 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 27 Sep 2015 13:10:26 +0200 Subject: fixed some output buffer problems --- src/cssh.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/cssh.c b/src/cssh.c index 2281eea..9ceb191 100644 --- a/src/cssh.c +++ b/src/cssh.c @@ -516,9 +516,9 @@ static ssize_t output_buffer( FILE *f, const char *host, const char *buffer, con size_t bsize = bufsize; ssize_t nwritten = 0; const char *p; - while( ( p < buffer + bufsize ) && ( p = buffer_contains_a_line( b, bsize ) ) != NULL) { + while( ( b < buffer + bufsize ) && ( p = buffer_contains_a_line( b, bsize ) ) != NULL) { if( tagging ) { - fprintf( f, "[%s]: ", host ); + fprintf( f, "[%s]: ", host ); fflush( f ); } ssize_t n = p - b; @@ -532,8 +532,10 @@ static ssize_t output_buffer( FILE *f, const char *host, const char *buffer, con wrc, n ); return -1; } - nwritten += n + 1; - b = p + 1; + nwritten += n; + assert( nwritten <= bufsize ); + p++; + b = p; fprintf( f, "\n" ); } @@ -1041,10 +1043,10 @@ int main( int argc, char *argv[] ) strerror( errno ) ); cleanup_sessions( &session, &ssh_data, NULL, host, port, nof_sessions, args_info.verbose_given > 0 ); exit( EXIT_FAILURE ); - } else if( wrc < nread ) { - memmove( ssh_data[i].stdout_buf, ssh_data[i].stdout_bptr + wrc, nread - wrc ); - ssh_data[i].stdout_bptr = ssh_data[i].stdout_buf + nread - wrc + 1; } + assert( wrc <= nread + ( ssh_data[i].stdout_bptr - ssh_data[i].stdout_buf ) ); + memmove( ssh_data[i].stdout_buf, ssh_data[i].stdout_buf + wrc, nread + ( ssh_data[i].stdout_bptr - ssh_data[i].stdout_buf ) - wrc ); + ssh_data[i].stdout_bptr = ssh_data[i].stdout_buf + nread + ( ssh_data[i].stdout_bptr - ssh_data[i].stdout_buf ) - wrc; } } @@ -1058,7 +1060,7 @@ int main( int argc, char *argv[] ) } if( rc > 0 ) { - unsigned int nread = ssh_channel_read_nonblocking( ssh_data[i].channel, ssh_data[i].stderr_bptr, BUFSIZE - ( ssh_data[i].stdout_bptr - ssh_data[i].stderr_buf ), 1 ); + unsigned int nread = ssh_channel_read_nonblocking( ssh_data[i].channel, ssh_data[i].stderr_bptr, BUFSIZE - ( ssh_data[i].stderr_bptr - ssh_data[i].stderr_buf ), 1 ); if( nread == SSH_ERROR ) { fprintf( stderr, "ERROR: ssh_channel_read_nonblocking on stderr failed: %s\n", ssh_get_error( session[i] ) ); @@ -1067,16 +1069,16 @@ int main( int argc, char *argv[] ) } if( nread > 0 ) { - ssize_t wrc = output_buffer( stderr, host[i], ssh_data[i].stderr_buf, nread + ( ssh_data[i].stdout_bptr - ssh_data[i].stderr_buf ) , args_info.tagging_given ); + ssize_t wrc = output_buffer( stderr, host[i], ssh_data[i].stderr_buf, nread + ( ssh_data[i].stderr_bptr - ssh_data[i].stderr_buf ), args_info.tagging_given ); if( wrc < 0 ) { fprintf( stderr, "ERROR: while writting to stderr: %s\n", strerror( errno ) ); cleanup_sessions( &session, &ssh_data, NULL, host, port, nof_sessions, args_info.verbose_given > 0 ); exit( EXIT_FAILURE ); - } else if( wrc < nread ) { - memmove( ssh_data[i].stderr_buf, ssh_data[i].stderr_bptr + wrc, nread - wrc ); - ssh_data[i].stderr_bptr += nread - wrc + 1; } + assert( wrc <= nread + ( ssh_data[i].stderr_bptr - ssh_data[i].stderr_buf ) ); + memmove( ssh_data[i].stderr_buf, ssh_data[i].stderr_buf + wrc, nread + ( ssh_data[i].stderr_bptr - ssh_data[i].stderr_buf ) - wrc ); + ssh_data[i].stderr_bptr = ssh_data[i].stderr_buf + nread + ( ssh_data[i].stderr_bptr - ssh_data[i].stderr_buf ) - wrc; } if( nread == 0 ) { -- cgit v1.2.3-54-g00ecf