summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2015-09-27 13:10:26 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2015-09-27 13:10:26 +0200
commit4bda2a6fb366e227d31cd4ba74a4970ff7afcc15 (patch)
tree180605c04d17fbeeef0345c324e5b23673aaf34e
parentfa12355609aa0e84b30d24945c360e16b7e5df72 (diff)
downloadcssh-4bda2a6fb366e227d31cd4ba74a4970ff7afcc15.tar.gz
cssh-4bda2a6fb366e227d31cd4ba74a4970ff7afcc15.tar.bz2
fixed some output buffer problems
-rw-r--r--src/cssh.c26
1 files 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 ) {