From 0220852a66676f4cefaab1d09e5a594990d87d15 Mon Sep 17 00:00:00 2001 From: igor-m Date: Sat, 12 Apr 2014 01:25:31 +0200 Subject: [PATCH] Fix of va_arg aliasing in doprnt.c --- src/libc/stdio/doprnt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libc/stdio/doprnt.c b/src/libc/stdio/doprnt.c index 78b7751..40a8998 100644 --- a/src/libc/stdio/doprnt.c +++ b/src/libc/stdio/doprnt.c @@ -53,6 +53,11 @@ static unsigned char mkhex (unsigned char ch); static int cvt (double number, int prec, int sharpflag, unsigned char *negp, unsigned char fmtch, unsigned char *startp, unsigned char *endp); + union { + unsigned long u32; + va_list ap32; + } x; + int _doprnt (char const *fmt, va_list ap, FILE *stream) { @@ -367,7 +372,9 @@ number: if (sign && ((long) ul != 0L)) { double d; unsigned long *l = (unsigned long *) &d; - if (*(unsigned long*)&ap & 4L) { + x.ap32 = ap; + + if ( x.u32 & 4) { l[0]= va_arg(ap, unsigned long); l[1]= va_arg(ap, unsigned long); }