msvcrt: do not overlap in strcpy (valgrind) (try 3)
André Hentschel
nerv at dawncrow.de
Sat Oct 31 06:09:06 CDT 2009
here is a case where valgrind claims about "Source and destination overlap in strcpy".
this is a proposal for a safer string moving.
see also http://kegel.com/wine/valgrind/logs/2009-10-26-08.26/vg-msvcrt_printf.txt
try2: use memmove instead like Vitaliy metioned
try3: general optimization
---
dlls/msvcrt/math.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 010e1a6..6f0982d 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -836,7 +836,7 @@ double CDECL _nextafter(double num, double next)
*/
char * CDECL _ecvt( double number, int ndigits, int *decpt, int *sign )
{
- int prec;
+ int prec, len;
thread_data_t *data = msvcrt_get_thread_data();
/* FIXME: check better for overflow (native supports over 300 chars's) */
ndigits = min( ndigits, 80 - 7); /* 7 : space for dec point, 1 for "e",
@@ -853,10 +853,10 @@ char * CDECL _ecvt( double number, int ndigits, int *decpt, int *sign )
/* handle cases with zero ndigits or less */
prec = ndigits;
if( prec < 1) prec = 2;
- snprintf(data->efcvt_buffer, 80, "%.*le", prec - 1, number);
+ len = snprintf(data->efcvt_buffer, 80, "%.*le", prec - 1, number);
/* take the decimal "point away */
if( prec != 1)
- strcpy( data->efcvt_buffer + 1, data->efcvt_buffer + 2);
+ memmove( data->efcvt_buffer + 1, data->efcvt_buffer + 2, len );
/* take the exponential "e" out */
data->efcvt_buffer[ prec] = '\0';
/* read the exponent */
--
Best Regards, André Hentschel
More information about the wine-patches
mailing list