From 1597b7447a81f372068b68a7830ac83aa3b4527f Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 1 Mar 2015 21:52:15 +0100 Subject: [PATCH] vfprintf: Define WORK_BUFFER_SIZE This constant will allow us to refer to the number of elements in work_buffer across a function call boundary. --- ChangeLog | 6 ++++-- stdio-common/vfprintf.c | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 94a2402459..c422a37948 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,8 +2,10 @@ * stdio-common/vfprintf.c (THOUSANDS_SEP_T): New typedef. (group_number, vfprintf): Use it. - (JUMP_TABLE_BASE_LABEL): New preprocessor macro. - (JUMP, REF): Use it. + (JUMP_TABLE_BASE_LABEL): New preprocessor macro. + (JUMP, REF): Use it. + (WORK_BUFFER_SIZE): New enum constant. + (process_arg, vfprintf): Use it. 2015-03-06 Rical Jasan diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 030d33d981..0e435f2a75 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -196,9 +196,11 @@ typedef wchar_t THOUSANDS_SEP_T; #endif -/* Global variables. */ +/* Global constants. */ static const CHAR_T null[] = L_("(null)"); +/* Size of the work_buffer variable (in characters, not bytes. */ +enum { WORK_BUFFER_SIZE = 1000 }; /* Helper function to provide temporary buffering for unbuffered streams. */ static int buffered_vfprintf (FILE *stream, const CHAR_T *fmt, va_list) @@ -235,7 +237,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) const UCHAR_T *end_of_spec; /* Buffer intermediate results. */ - CHAR_T work_buffer[1000]; + CHAR_T work_buffer[WORK_BUFFER_SIZE]; CHAR_T *workstart = NULL; CHAR_T *workend; @@ -986,7 +988,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) /* Print description of error ERRNO. */ \ string = \ (CHAR_T *) __strerror_r (save_errno, (char *) work_buffer, \ - sizeof work_buffer); \ + WORK_BUFFER_SIZE * sizeof (CHAR_T)); \ is_long = 0; /* This is no wide-char string. */ \ goto LABEL (print_string) @@ -1366,7 +1368,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) CHAR_T spec; workstart = NULL; - workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; + workend = work_buffer + WORK_BUFFER_SIZE; /* Get current character in format string. */ JUMP (*++f, step0_jumps); @@ -1465,7 +1467,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) goto all_done; } - if (width >= sizeof (work_buffer) / sizeof (work_buffer[0]) - 32) + if (width >= WORK_BUFFER_SIZE - 32) { /* We have to use a special buffer. The "32" is just a safe bet for all the output which is not counted in the width. */ @@ -1498,7 +1500,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) goto all_done; } - if (width >= sizeof (work_buffer) / sizeof (work_buffer[0]) - 32) + if (width >= WORK_BUFFER_SIZE - 32) { /* We have to use a special buffer. The "32" is just a safe bet for all the output which is not counted in the width. */ @@ -1564,8 +1566,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) } else prec = 0; - if (prec > width - && prec > sizeof (work_buffer) / sizeof (work_buffer[0]) - 32) + if (prec > width && prec > WORK_BUFFER_SIZE - 32) { if (__glibc_unlikely (prec >= INT_MAX / sizeof (CHAR_T) - 32)) { @@ -1935,7 +1936,7 @@ do_positional: CHAR_T spec = specs[nspecs_done].info.spec; workstart = NULL; - workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)]; + workend = work_buffer + WORK_BUFFER_SIZE; /* Fill in last information. */ if (specs[nspecs_done].width_arg != -1) @@ -1969,8 +1970,7 @@ do_positional: } /* Maybe the buffer is too small. */ - if (MAX (prec, width) + 32 > (int) (sizeof (work_buffer) - / sizeof (CHAR_T))) + if (MAX (prec, width) + 32 > WORK_BUFFER_SIZE) { if (__libc_use_alloca ((MAX (prec, width) + 32) * sizeof (CHAR_T))) -- 2.11.4.GIT