mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
vfprintf.c: Refactor magic number 32 into EXTSIZ.
The magic number 32 is used everywhere as extra size to use when doing certain operations. This commit refactors that into a macro so you can change this value if you're debugging something in a local build.
This commit is contained in:
parent
1721145f03
commit
7224e32d7b
2 changed files with 33 additions and 25 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2017-05-08 Carlos O'Donell <carlos@redhat.com>
|
||||||
|
|
||||||
|
* stdio-common/vfprintf.c (EXTSIZ): Define.
|
||||||
|
(vfprintf): Use EXTSIZ.
|
||||||
|
(printf_positional): Likewise.
|
||||||
|
|
||||||
2017-05-08 Joseph Myers <joseph@codesourcery.com>
|
2017-05-08 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/kernel-features.h
|
* sysdeps/unix/sysv/linux/kernel-features.h
|
||||||
|
|
|
@ -45,6 +45,10 @@
|
||||||
#define va_list _IO_va_list
|
#define va_list _IO_va_list
|
||||||
#undef BUFSIZ
|
#undef BUFSIZ
|
||||||
#define BUFSIZ _IO_BUFSIZ
|
#define BUFSIZ _IO_BUFSIZ
|
||||||
|
/* In some cases we need extra space for all the output which is not
|
||||||
|
counted in the width of the string. We assume 32 characters is
|
||||||
|
enough. */
|
||||||
|
#define EXTSIZ 32
|
||||||
#define ARGCHECK(S, Format) \
|
#define ARGCHECK(S, Format) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
|
@ -1456,20 +1460,19 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
left = 1;
|
left = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__glibc_unlikely (width >= INT_MAX / sizeof (CHAR_T) - 32))
|
if (__glibc_unlikely (width >= INT_MAX / sizeof (CHAR_T) - EXTSIZ))
|
||||||
{
|
{
|
||||||
__set_errno (EOVERFLOW);
|
__set_errno (EOVERFLOW);
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (width >= WORK_BUFFER_SIZE - 32)
|
if (width >= WORK_BUFFER_SIZE - EXTSIZ)
|
||||||
{
|
{
|
||||||
/* We have to use a special buffer. The "32" is just a safe
|
/* We have to use a special buffer. */
|
||||||
bet for all the output which is not counted in the width. */
|
size_t needed = ((size_t) width + EXTSIZ) * sizeof (CHAR_T);
|
||||||
size_t needed = ((size_t) width + 32) * sizeof (CHAR_T);
|
|
||||||
if (__libc_use_alloca (needed))
|
if (__libc_use_alloca (needed))
|
||||||
workend = (CHAR_T *) alloca (needed) + width + 32;
|
workend = (CHAR_T *) alloca (needed) + width + EXTSIZ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
workstart = (CHAR_T *) malloc (needed);
|
workstart = (CHAR_T *) malloc (needed);
|
||||||
|
@ -1478,7 +1481,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
workend = workstart + width + 32;
|
workend = workstart + width + EXTSIZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1489,20 +1492,19 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
width = read_int (&f);
|
width = read_int (&f);
|
||||||
|
|
||||||
if (__glibc_unlikely (width == -1
|
if (__glibc_unlikely (width == -1
|
||||||
|| width >= INT_MAX / sizeof (CHAR_T) - 32))
|
|| width >= INT_MAX / sizeof (CHAR_T) - EXTSIZ))
|
||||||
{
|
{
|
||||||
__set_errno (EOVERFLOW);
|
__set_errno (EOVERFLOW);
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (width >= WORK_BUFFER_SIZE - 32)
|
if (width >= WORK_BUFFER_SIZE - EXTSIZ)
|
||||||
{
|
{
|
||||||
/* We have to use a special buffer. The "32" is just a safe
|
/* We have to use a special buffer. */
|
||||||
bet for all the output which is not counted in the width. */
|
size_t needed = ((size_t) width + EXTSIZ) * sizeof (CHAR_T);
|
||||||
size_t needed = ((size_t) width + 32) * sizeof (CHAR_T);
|
|
||||||
if (__libc_use_alloca (needed))
|
if (__libc_use_alloca (needed))
|
||||||
workend = (CHAR_T *) alloca (needed) + width + 32;
|
workend = (CHAR_T *) alloca (needed) + width + EXTSIZ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
workstart = (CHAR_T *) malloc (needed);
|
workstart = (CHAR_T *) malloc (needed);
|
||||||
|
@ -1511,7 +1513,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
workend = workstart + width + 32;
|
workend = workstart + width + EXTSIZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (*f == L_('$'))
|
if (*f == L_('$'))
|
||||||
|
@ -1562,23 +1564,23 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
prec = 0;
|
prec = 0;
|
||||||
if (prec > width && prec > WORK_BUFFER_SIZE - 32)
|
if (prec > width && prec > WORK_BUFFER_SIZE - EXTSIZ)
|
||||||
{
|
{
|
||||||
/* Deallocate any previously allocated buffer because it is
|
/* Deallocate any previously allocated buffer because it is
|
||||||
too small. */
|
too small. */
|
||||||
if (__glibc_unlikely (workstart != NULL))
|
if (__glibc_unlikely (workstart != NULL))
|
||||||
free (workstart);
|
free (workstart);
|
||||||
workstart = NULL;
|
workstart = NULL;
|
||||||
if (__glibc_unlikely (prec >= INT_MAX / sizeof (CHAR_T) - 32))
|
if (__glibc_unlikely (prec >= INT_MAX / sizeof (CHAR_T) - EXTSIZ))
|
||||||
{
|
{
|
||||||
__set_errno (EOVERFLOW);
|
__set_errno (EOVERFLOW);
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
size_t needed = ((size_t) prec + 32) * sizeof (CHAR_T);
|
size_t needed = ((size_t) prec + EXTSIZ) * sizeof (CHAR_T);
|
||||||
|
|
||||||
if (__libc_use_alloca (needed))
|
if (__libc_use_alloca (needed))
|
||||||
workend = (CHAR_T *) alloca (needed) + prec + 32;
|
workend = (CHAR_T *) alloca (needed) + prec + EXTSIZ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
workstart = (CHAR_T *) malloc (needed);
|
workstart = (CHAR_T *) malloc (needed);
|
||||||
|
@ -1587,7 +1589,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
workend = workstart + prec + 32;
|
workend = workstart + prec + EXTSIZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
JUMP (*f, step2_jumps);
|
JUMP (*f, step2_jumps);
|
||||||
|
@ -1964,23 +1966,23 @@ printf_positional (_IO_FILE *s, const CHAR_T *format, int readonly_format,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Maybe the buffer is too small. */
|
/* Maybe the buffer is too small. */
|
||||||
if (MAX (prec, width) + 32 > WORK_BUFFER_SIZE)
|
if (MAX (prec, width) + EXTSIZ > WORK_BUFFER_SIZE)
|
||||||
{
|
{
|
||||||
if (__libc_use_alloca ((MAX (prec, width) + 32)
|
if (__libc_use_alloca ((MAX (prec, width) + EXTSIZ)
|
||||||
* sizeof (CHAR_T)))
|
* sizeof (CHAR_T)))
|
||||||
workend = ((CHAR_T *) alloca ((MAX (prec, width) + 32)
|
workend = ((CHAR_T *) alloca ((MAX (prec, width) + EXTSIZ)
|
||||||
* sizeof (CHAR_T))
|
* sizeof (CHAR_T))
|
||||||
+ (MAX (prec, width) + 32));
|
+ (MAX (prec, width) + EXTSIZ));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
workstart = (CHAR_T *) malloc ((MAX (prec, width) + 32)
|
workstart = (CHAR_T *) malloc ((MAX (prec, width) + EXTSIZ)
|
||||||
* sizeof (CHAR_T));
|
* sizeof (CHAR_T));
|
||||||
if (workstart == NULL)
|
if (workstart == NULL)
|
||||||
{
|
{
|
||||||
done = -1;
|
done = -1;
|
||||||
goto all_done;
|
goto all_done;
|
||||||
}
|
}
|
||||||
workend = workstart + (MAX (prec, width) + 32);
|
workend = workstart + (MAX (prec, width) + EXTSIZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue