[PING] [PATCH] vfwprintf.c
Sun Jul 17 03:45:00 GMT 2011
It would be great to get some feedback from you on this improved patch:
Is there any other maintainer you would like me to add to the CC list?
From: firstname.lastname@example.org [mailto:email@example.com] On
Behalf Of Yufeng Zhang
Sent: 28 June 2011 13:09
To: 'Jeff Johnston'
Cc: firstname.lastname@example.org; email@example.com
Subject: RE: [PATCH] vfwprintf.c
Thank you for the effort in verifying the patch. I realized that there
are some problems in the previous patch. Please find the updated patch
in the attachment.
There are two improvement:
1. the new test is more robust: instead of the bogus hard-coded
wide-char string representation of a floating-point value, the test in
the updated patch calls snprintf and mbstowcs to generate such a
wide-char string to be used by wcscmp to compare with the result from
I tested my previous patch on arm-eabi and the reason it passed on
arm-eabi but failed on x86-linux is because that depending on whether
_NO_LONGDBL is defined or not, either _dtoa_r or _ldtoa_r will be used
for the conversion from floating-point value to char string; while the
latter pads '0' after the significant digits, the former seems to do
2. The previous patch only works if _MB_CAPABLE is not defined; the
updated patch covers the both cases. wcvt is changed to store the full
length of the un-truncated wide-char string in *length, so that its
caller can check whether a larger buffer is needed by comparing the
returned length with the length of the buffer that was passed to wcvt.
The patch has passed the newlib testsuite on arm-eabi and x86-linux.
Please let me know if this updated patch works for you.
2011-06-28 Yufeng Zhang <firstname.lastname@example.org>
* libc/stdio/vfwprintf.c (wcvt): Add a new parameter len of type
int. *length is set to the value of (rev - digits) regardless
of whether _MB_CAPABLE is defined or not. Replace BUF with len
in calling _mbsnrtowcs_r and also in the loop where _MB_CAPABLE
is not defined.
(_VFWPRINTF_R): Call wcvt with an extra argument. Call wcvt
again with allocated new buffer if buf is not large enough for
* testsuite/newlib.stdio/stdio.exp: New.
* testsuite/newlib.stdio/swprintf.c: Likewise.
> -----Original Message-----
> From: email@example.com [mailto:firstname.lastname@example.org]
> On Behalf Of Jeff Johnston
> Sent: 10 June 2011 19:39
> To: Yufeng Zhang
> Cc: email@example.com
> Subject: Re: [PATCH] vfwprintf.c
> I'm having trouble verifying this patch. I think there may possibly be
> another issue in newlib. When I apply the patch and build both an
> x86-linux version of newlib and mn10300 version of newlib, neither pass
> the test. They are both padding the result with zeroes.
> Even weirder is that if I change the test to use sprintf, mn10300 gives
> the expected result whereas x86-linux is not.
> I need to look at this a bit more. It is currently Eclipse release
> train time so I haven't had a long time to look at why my results vary.
> Were you able to verify this worked and what platform did you
> configure/test on?
> -- Jeff J.
> On 06/09/2011 08:50 AM, Yufeng Zhang wrote:
> > Hi,
> > This patch fixes a problem in the newlib vfwprintf implementation.
> > For each conversion specifier in the format string that is [feEgG],
> > current vfwprintf implementation provides only a 40-length wide-char
> > buffer for conversion. This causes code like the following to
> > wchar_t largebuf;
> > double val = 1.7976931348623158e+308;
> > swprintf(largebuf, 512, L"%.*f", 3, val);
> > Only the first 40 characters can be correctly converted due to the
> > limited length of the buffer. This will cause junk in the rest of the
> > converted wide-char sequence, and can potentially corrupt the memory
> > immediately after 'largebuf'.
> > The example code is a repro of the libstdc++-v3 test
> > ./libstdc++-
> > 02.cc
> > which currently fails when newlib is used as the C library.
> > The patch was prepared with the consideration of minimum code change.
> > It is probably not worth a bigger surgery in the code since the
> > conversion of extremely long wide char sequence is fairly rare.
> > The 2nd attached patch adds a test to the testsuite.
> > Thanks,
> > Yufeng
> > newlib/ChangeLog
> > 2011-06-09 Yufeng Zhang<firstname.lastname@example.org>
> > * libc/stdio/vfwprintf.c (wcvt): Add new parameter 'len' of
> > int. Replace BUF with len.
> > (VFWPRINTF): Add extra call to wcvt with a malloced new
> > when the fixed-length buffer 'buf' is not large enough.
More information about the Newlib