From 8ecaaad0494fab97d54e5bfb38a3d7a036a9ea66 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 15 Mar 2019 03:04:56 +0100 Subject: [PATCH] Fix variable argument list traversal for doubles. * include/stdarg.h (va_align): New macro. (va_arg8): New macro. * lib/stdio/vfprintf.c (vfprintf): Use it. * lib/stdio/vsnprintf.c (vsnprintf): Use it. --- include/stdarg.h | 2 ++ lib/stdio/vfprintf.c | 2 +- lib/stdio/vsnprintf.c | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/stdarg.h b/include/stdarg.h index 7e31557a..3d5567f6 100644 --- a/include/stdarg.h +++ b/include/stdarg.h @@ -34,6 +34,8 @@ typedef char *va_list; #define va_start(ap, last) (void)((ap) = (char*)(&(last) + 1)) #define va_arg(ap, type) (type)(((long*)((ap) = ((ap) + sizeof (void*))))[-1]) +#define va_align(ap, alignment) ((((unsigned long) (unsigned char*) ap) + (alignment) - 1) &~ (alignment - 1)) +#define va_arg8(ap, type) (type)(((double*)((ap) = (va_align((ap), 8) + sizeof(double))))[-1]) #define va_end(ap) (void)((ap) = 0) #define va_copy(dest, src) dest = src diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c index ef1db89c..7f2c55ee 100644 --- a/lib/stdio/vfprintf.c +++ b/lib/stdio/vfprintf.c @@ -211,7 +211,7 @@ vfprintf (FILE * f, char const *format, va_list ap) case 'g': case 'G': { - double d = va_arg (ap, double); + double d = va_arg8 (ap, double); char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s); diff --git a/lib/stdio/vsnprintf.c b/lib/stdio/vsnprintf.c index 2c0aa11b..c1b56840 100644 --- a/lib/stdio/vsnprintf.c +++ b/lib/stdio/vsnprintf.c @@ -227,7 +227,7 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) case 'g': case 'G': { - double d = va_arg (ap, double); + double d = va_arg8 (ap, double); char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s);