From 177357c62172385f9ccee7fb37b456de22268028 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Thu, 24 Jan 2019 16:52:17 +0000 Subject: upstream: Have progressmeter force an update at the beginning and end of each transfer. Fixes the problem recently introduces where very quick transfers do not display the progressmeter at all. Spotted by naddy@ OpenBSD-Commit-ID: 68dc46c259e8fdd4f5db3ec2a130f8e4590a7a9a Origin: upstream, https://anongit.mindrot.org/openssh.git/commit/?id=bdc6c63c80b55bcbaa66b5fde31c1cb1d09a41eb Last-Update: 2019-02-08 Patch-Name: have-progressmeter-force-update-at-beginning-and-end-transfer.patch Ported to Stretch (OpenSSH 7.5) by Yves-Alexis Perez Fix a regression introduced by the patch for CVE-2019-6109 --- progressmeter.c | 13 +++++-------- progressmeter.h | 4 ++-- scp.c | 2 +- sftp-client.c | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/progressmeter.c b/progressmeter.c index add462dd..e385c125 100644 --- a/progressmeter.c +++ b/progressmeter.c @@ -1,4 +1,4 @@ -/* $OpenBSD: progressmeter.c,v 1.46 2019/01/23 08:01:46 dtucker Exp $ */ +/* $OpenBSD: progressmeter.c,v 1.47 2019/01/24 16:52:17 dtucker Exp $ */ /* * Copyright (c) 2003 Nils Nordman. All rights reserved. * @@ -59,9 +59,6 @@ static void format_rate(char *, int, off_t); static void sig_winch(int); static void setscreensize(void); -/* updates the progressmeter to reflect the current state of the transfer */ -void refresh_progress_meter(void); - /* signal handler for updating the progress meter */ static void sig_alarm(int); @@ -120,7 +117,7 @@ format_size(char *buf, int size, off_t bytes) } void -refresh_progress_meter(void) +refresh_progress_meter(int force_update) { char buf[MAX_WINSIZE + 1]; off_t transferred; @@ -131,7 +128,7 @@ refresh_progress_meter(void) int hours, minutes, seconds; int file_len; - if ((!alarm_fired && !win_resized) || !can_output()) + if ((!force_update && !alarm_fired && !win_resized) || !can_output()) return; alarm_fired = 0; @@ -254,7 +251,7 @@ start_progress_meter(const char *f, off_t filesize, off_t *ctr) bytes_per_second = 0; setscreensize(); - refresh_progress_meter(); + refresh_progress_meter(1); signal(SIGALRM, sig_alarm); signal(SIGWINCH, sig_winch); @@ -271,7 +268,7 @@ stop_progress_meter(void) /* Ensure we complete the progress */ if (cur_pos != end_pos) - refresh_progress_meter(); + refresh_progress_meter(1); atomicio(vwrite, STDOUT_FILENO, "\n", 1); } diff --git a/progressmeter.h b/progressmeter.h index 8f667806..1703ea75 100644 --- a/progressmeter.h +++ b/progressmeter.h @@ -1,4 +1,4 @@ -/* $OpenBSD: progressmeter.h,v 1.4 2019/01/23 08:01:46 dtucker Exp $ */ +/* $OpenBSD: progressmeter.h,v 1.5 2019/01/24 16:52:17 dtucker Exp $ */ /* * Copyright (c) 2002 Nils Nordman. All rights reserved. * @@ -24,5 +24,5 @@ */ void start_progress_meter(const char *, off_t, off_t *); -void refresh_progress_meter(void); +void refresh_progress_meter(int); void stop_progress_meter(void); diff --git a/scp.c b/scp.c index e2e16993..2f5a4d46 100644 --- a/scp.c +++ b/scp.c @@ -567,7 +567,7 @@ scpio(void *_cnt, size_t s) off_t *cnt = (off_t *)_cnt; *cnt += s; - refresh_progress_meter(); + refresh_progress_meter(0); if (limit_kbps > 0) bandwidth_limit(&bwlimit, s); return 0; diff --git a/sftp-client.c b/sftp-client.c index 3cefbe26..b4be8cd6 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -94,7 +94,7 @@ sftpio(void *_bwlimit, size_t amount) { struct bwlimit *bwlimit = (struct bwlimit *)_bwlimit; - refresh_progress_meter(); + refresh_progress_meter(0); if (bwlimit != NULL) bandwidth_limit(bwlimit, amount); return 0;