mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-10 19:30:10 +00:00
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.
This commit is contained in:
parent
627e7a5f5b
commit
1597b7447a
@ -4,6 +4,8 @@
|
|||||||
(group_number, vfprintf): Use it.
|
(group_number, vfprintf): Use it.
|
||||||
(JUMP_TABLE_BASE_LABEL): New preprocessor macro.
|
(JUMP_TABLE_BASE_LABEL): New preprocessor macro.
|
||||||
(JUMP, REF): Use it.
|
(JUMP, REF): Use it.
|
||||||
|
(WORK_BUFFER_SIZE): New enum constant.
|
||||||
|
(process_arg, vfprintf): Use it.
|
||||||
|
|
||||||
2015-03-06 Rical Jasan <ricaljasan@pacific.net>
|
2015-03-06 Rical Jasan <ricaljasan@pacific.net>
|
||||||
|
|
||||||
|
@ -196,9 +196,11 @@ typedef wchar_t THOUSANDS_SEP_T;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Global variables. */
|
/* Global constants. */
|
||||||
static const CHAR_T null[] = L_("(null)");
|
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. */
|
/* Helper function to provide temporary buffering for unbuffered streams. */
|
||||||
static int buffered_vfprintf (FILE *stream, const CHAR_T *fmt, va_list)
|
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;
|
const UCHAR_T *end_of_spec;
|
||||||
|
|
||||||
/* Buffer intermediate results. */
|
/* Buffer intermediate results. */
|
||||||
CHAR_T work_buffer[1000];
|
CHAR_T work_buffer[WORK_BUFFER_SIZE];
|
||||||
CHAR_T *workstart = NULL;
|
CHAR_T *workstart = NULL;
|
||||||
CHAR_T *workend;
|
CHAR_T *workend;
|
||||||
|
|
||||||
@ -986,7 +988,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
/* Print description of error ERRNO. */ \
|
/* Print description of error ERRNO. */ \
|
||||||
string = \
|
string = \
|
||||||
(CHAR_T *) __strerror_r (save_errno, (char *) work_buffer, \
|
(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. */ \
|
is_long = 0; /* This is no wide-char string. */ \
|
||||||
goto LABEL (print_string)
|
goto LABEL (print_string)
|
||||||
|
|
||||||
@ -1366,7 +1368,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
CHAR_T spec;
|
CHAR_T spec;
|
||||||
|
|
||||||
workstart = NULL;
|
workstart = NULL;
|
||||||
workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
|
workend = work_buffer + WORK_BUFFER_SIZE;
|
||||||
|
|
||||||
/* Get current character in format string. */
|
/* Get current character in format string. */
|
||||||
JUMP (*++f, step0_jumps);
|
JUMP (*++f, step0_jumps);
|
||||||
@ -1465,7 +1467,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|||||||
goto all_done;
|
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
|
/* 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. */
|
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;
|
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
|
/* 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. */
|
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
|
else
|
||||||
prec = 0;
|
prec = 0;
|
||||||
if (prec > width
|
if (prec > width && prec > WORK_BUFFER_SIZE - 32)
|
||||||
&& prec > sizeof (work_buffer) / sizeof (work_buffer[0]) - 32)
|
|
||||||
{
|
{
|
||||||
if (__glibc_unlikely (prec >= INT_MAX / sizeof (CHAR_T) - 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;
|
CHAR_T spec = specs[nspecs_done].info.spec;
|
||||||
|
|
||||||
workstart = NULL;
|
workstart = NULL;
|
||||||
workend = &work_buffer[sizeof (work_buffer) / sizeof (CHAR_T)];
|
workend = work_buffer + WORK_BUFFER_SIZE;
|
||||||
|
|
||||||
/* Fill in last information. */
|
/* Fill in last information. */
|
||||||
if (specs[nspecs_done].width_arg != -1)
|
if (specs[nspecs_done].width_arg != -1)
|
||||||
@ -1969,8 +1970,7 @@ do_positional:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe the buffer is too small. */
|
/* Maybe the buffer is too small. */
|
||||||
if (MAX (prec, width) + 32 > (int) (sizeof (work_buffer)
|
if (MAX (prec, width) + 32 > WORK_BUFFER_SIZE)
|
||||||
/ sizeof (CHAR_T)))
|
|
||||||
{
|
{
|
||||||
if (__libc_use_alloca ((MAX (prec, width) + 32)
|
if (__libc_use_alloca ((MAX (prec, width) + 32)
|
||||||
* sizeof (CHAR_T)))
|
* sizeof (CHAR_T)))
|
||||||
|
Loading…
Reference in New Issue
Block a user