Revert "vreportf: avoid intermediate buffer"

This reverts commit f4c3edc0b1.

The purpose of that commit was to let us write errors of
arbitrary length to stderr by skipping the intermediate
buffer and sending our varargs straight to fprintf. That
works, but it comes with a downside: we do not get access to
the varargs before they are sent to stderr.

On balance, it's not a good tradeoff. Error messages larger
than our 4K buffer are quite uncommon, and we've lost the
ability to make any modifications to the output (e.g., to
remove non-printable characters).

The only way to have both would be one of:

  1. Write into a dynamic buffer. But this is a bad idea for
     a low-level function that may be called when malloc()
     has failed.

  2. Do our own printf-format varargs parsing. This is too
     complex to be worth the trouble.

Let's just revert that change and go back to a fixed buffer.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-01-11 09:02:03 -05:00 коммит произвёл Junio C Hamano
Родитель 0b65a8dbdb
Коммит b5a9e435c6
1 изменённых файлов: 3 добавлений и 12 удалений

15
usage.c
Просмотреть файл

@ -7,21 +7,13 @@
#include "cache.h"
static FILE *error_handle;
static int tweaked_error_buffering;
void vreportf(const char *prefix, const char *err, va_list params)
{
char msg[4096];
FILE *fh = error_handle ? error_handle : stderr;
fflush(fh);
if (!tweaked_error_buffering) {
setvbuf(fh, NULL, _IOLBF, 0);
tweaked_error_buffering = 1;
}
fputs(prefix, fh);
vfprintf(fh, err, params);
fputc('\n', fh);
vsnprintf(msg, sizeof(msg), err, params);
fprintf(fh, "%s%s\n", prefix, msg);
}
static NORETURN void usage_builtin(const char *err, va_list params)
@ -78,7 +70,6 @@ void set_die_is_recursing_routine(int (*routine)(void))
void set_error_handle(FILE *fh)
{
error_handle = fh;
tweaked_error_buffering = 0;
}
void NORETURN usagef(const char *err, ...)