upstream commit

Backout rev. 1.43 for now.

The function update_progress_meter() calls refresh_progress_meter()
which calls snmprintf() which calls malloc(); but update_progress_meter()
acts as the SIGALRM signal handler.

"malloc(): error: recursive call" reported by sobrado@.

Upstream-ID: aaae57989431e5239c101f8310f74ccc83aeb93e
This commit is contained in:
schwarze@openbsd.org 2016-05-30 18:34:41 +00:00 committed by Darren Tucker
parent cd9e1eabeb
commit 6c1717190b

View File

@ -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. * Copyright (c) 2003 Nils Nordman. All rights reserved.
* *
@ -31,7 +31,6 @@
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
@ -40,7 +39,6 @@
#include "progressmeter.h" #include "progressmeter.h"
#include "atomicio.h" #include "atomicio.h"
#include "misc.h" #include "misc.h"
#include "utf8.h"
#define DEFAULT_WINSIZE 80 #define DEFAULT_WINSIZE 80
#define MAX_WINSIZE 512 #define MAX_WINSIZE 512
@ -121,14 +119,14 @@ format_size(char *buf, int size, off_t bytes)
void void
refresh_progress_meter(void) refresh_progress_meter(void)
{ {
char buf[MAX_WINSIZE * 4 + 1]; char buf[MAX_WINSIZE + 1];
off_t transferred; off_t transferred;
double elapsed, now; double elapsed, now;
int percent; int percent;
off_t bytes_left; off_t bytes_left;
int cur_speed; int cur_speed;
int hours, minutes, seconds; int hours, minutes, seconds;
size_t i; int i, len;
int file_len; int file_len;
transferred = *counter - (cur_pos ? cur_pos : start_pos); transferred = *counter - (cur_pos ? cur_pos : start_pos);
@ -159,16 +157,17 @@ refresh_progress_meter(void)
bytes_per_second = cur_speed; bytes_per_second = cur_speed;
/* filename */ /* filename */
buf[0] = '\r'; buf[0] = '\0';
buf[1] = '\0';
file_len = win_size - 35; file_len = win_size - 35;
if (file_len > 0) { if (file_len > 0) {
(void) snmprintf(buf + 1, sizeof(buf) - 1 - 35, len = snprintf(buf, file_len + 1, "\r%s", file);
&file_len, "%s", file); if (len < 0)
i = strlen(buf); len = 0;
while (++file_len < win_size - 35 && i + 1 < sizeof(buf)) if (len >= file_len + 1)
buf[i++] = ' '; len = file_len;
buf[i] = '\0'; for (i = len; i < file_len; i++)
buf[i] = ' ';
buf[file_len] = '\0';
} }
/* percent of transfer done */ /* percent of transfer done */
@ -176,18 +175,18 @@ refresh_progress_meter(void)
percent = ((float)cur_pos / end_pos) * 100; percent = ((float)cur_pos / end_pos) * 100;
else else
percent = 100; percent = 100;
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), snprintf(buf + strlen(buf), win_size - strlen(buf),
" %3d%% ", percent); " %3d%% ", percent);
/* amount transferred */ /* amount transferred */
format_size(buf + strlen(buf), sizeof(buf) - strlen(buf), format_size(buf + strlen(buf), win_size - strlen(buf),
cur_pos); cur_pos);
strlcat(buf, " ", sizeof(buf)); strlcat(buf, " ", win_size);
/* bandwidth usage */ /* 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); (off_t)bytes_per_second);
strlcat(buf, "/s ", sizeof(buf)); strlcat(buf, "/s ", win_size);
/* ETA */ /* ETA */
if (!transferred) if (!transferred)
@ -196,9 +195,9 @@ refresh_progress_meter(void)
stalled = 0; stalled = 0;
if (stalled >= STALL_TIME) if (stalled >= STALL_TIME)
strlcat(buf, "- stalled -", sizeof(buf)); strlcat(buf, "- stalled -", win_size);
else if (bytes_per_second == 0 && bytes_left) else if (bytes_per_second == 0 && bytes_left)
strlcat(buf, " --:-- ETA", sizeof(buf)); strlcat(buf, " --:-- ETA", win_size);
else { else {
if (bytes_left > 0) if (bytes_left > 0)
seconds = bytes_left / bytes_per_second; seconds = bytes_left / bytes_per_second;
@ -211,21 +210,19 @@ refresh_progress_meter(void)
seconds -= minutes * 60; seconds -= minutes * 60;
if (hours != 0) 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); "%d:%02d:%02d", hours, minutes, seconds);
else else
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), snprintf(buf + strlen(buf), win_size - strlen(buf),
" %02d:%02d", minutes, seconds); " %02d:%02d", minutes, seconds);
if (bytes_left > 0) if (bytes_left > 0)
strlcat(buf, " ETA", sizeof(buf)); strlcat(buf, " ETA", win_size);
else 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; last_update = now;
} }