=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/progressmeter.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- src/usr.bin/ssh/progressmeter.c 2016/05/25 23:48:45 1.43 +++ src/usr.bin/ssh/progressmeter.c 2016/05/30 18:34:41 1.44 @@ -1,4 +1,4 @@ -/* $OpenBSD: progressmeter.c,v 1.43 2016/05/25 23:48:45 schwarze Exp $ */ +/* $OpenBSD: progressmeter.c,v 1.44 2016/05/30 18:34:41 schwarze Exp $ */ /* * Copyright (c) 2003 Nils Nordman. All rights reserved. * @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -38,7 +37,6 @@ #include "progressmeter.h" #include "atomicio.h" #include "misc.h" -#include "utf8.h" #define DEFAULT_WINSIZE 80 #define MAX_WINSIZE 512 @@ -119,14 +117,14 @@ void refresh_progress_meter(void) { - char buf[MAX_WINSIZE * 4 + 1]; + char buf[MAX_WINSIZE + 1]; off_t transferred; double elapsed, now; int percent; off_t bytes_left; int cur_speed; int hours, minutes, seconds; - size_t i; + int i, len; int file_len; transferred = *counter - (cur_pos ? cur_pos : start_pos); @@ -157,16 +155,17 @@ bytes_per_second = cur_speed; /* filename */ - buf[0] = '\r'; - buf[1] = '\0'; + buf[0] = '\0'; file_len = win_size - 35; if (file_len > 0) { - (void) snmprintf(buf + 1, sizeof(buf) - 1 - 35, - &file_len, "%s", file); - i = strlen(buf); - while (++file_len < win_size - 35 && i + 1 < sizeof(buf)) - buf[i++] = ' '; - buf[i] = '\0'; + len = snprintf(buf, file_len + 1, "\r%s", file); + if (len < 0) + len = 0; + if (len >= file_len + 1) + len = file_len; + for (i = len; i < file_len; i++) + buf[i] = ' '; + buf[file_len] = '\0'; } /* percent of transfer done */ @@ -174,18 +173,18 @@ percent = ((float)cur_pos / end_pos) * 100; else percent = 100; - snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + snprintf(buf + strlen(buf), win_size - strlen(buf), " %3d%% ", percent); /* amount transferred */ - format_size(buf + strlen(buf), sizeof(buf) - strlen(buf), + format_size(buf + strlen(buf), win_size - strlen(buf), cur_pos); - strlcat(buf, " ", sizeof(buf)); + strlcat(buf, " ", win_size); /* bandwidth usage */ - format_rate(buf + strlen(buf), sizeof(buf) - strlen(buf), + format_rate(buf + strlen(buf), win_size - strlen(buf), (off_t)bytes_per_second); - strlcat(buf, "/s ", sizeof(buf)); + strlcat(buf, "/s ", win_size); /* ETA */ if (!transferred) @@ -194,9 +193,9 @@ stalled = 0; if (stalled >= STALL_TIME) - strlcat(buf, "- stalled -", sizeof(buf)); + strlcat(buf, "- stalled -", win_size); else if (bytes_per_second == 0 && bytes_left) - strlcat(buf, " --:-- ETA", sizeof(buf)); + strlcat(buf, " --:-- ETA", win_size); else { if (bytes_left > 0) seconds = bytes_left / bytes_per_second; @@ -209,21 +208,19 @@ seconds -= minutes * 60; if (hours != 0) - snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + snprintf(buf + strlen(buf), win_size - strlen(buf), "%d:%02d:%02d", hours, minutes, seconds); else - snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), + snprintf(buf + strlen(buf), win_size - strlen(buf), " %02d:%02d", minutes, seconds); if (bytes_left > 0) - strlcat(buf, " ETA", sizeof(buf)); + strlcat(buf, " ETA", win_size); else - strlcat(buf, " ", sizeof(buf)); + strlcat(buf, " ", win_size); } - if (win_size < 35) - buf[win_size] = '\0'; - atomicio(vwrite, STDOUT_FILENO, buf, strlen(buf)); + atomicio(vwrite, STDOUT_FILENO, buf, win_size - 1); last_update = now; }