[Bug 2039] New: read float bug in scanf.h in msvcrt.dll.so
Wine Bugs
wine-bugs at winehq.org
Fri Feb 20 01:39:43 CST 2004
http://bugs.winehq.org/show_bug.cgi?id=2039
Summary: read float bug in scanf.h in msvcrt.dll.so
Product: Wine
Version: 20040213
Platform: PC
OS/Version: Linux
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: wine-misc
AssignedTo: wine-bugs at winehq.org
ReportedBy: elmkni at freenet.de
Hi,
my name is Elmar Knittel (elmkni at freenet.de),
and I might have found a little bug in wine :(
I have got SuSE Linux 8.2 personal and
wine-20040213-SuSELinux82.i586.rpm and
wine-20040213-SuSELinux82.src.rpm from
sourceforge.net/projects/wine.
There seems to be problem within the scan functions
in wine-20040213/dlls/msvcrt/scanf.h, line 265/266:
/* get first digit. */
if (!_ISDIGIT_(nch)) break;
break is triggered by decimals without leading digit, e.g:
//---------------------------------------------------------------------
//
// test.c - compile with MinGW under WIN32
//
// DEPEND = test.c
// SHRINK = upx --best --crp-ms=999999 --nrv2b
// CFLAGS = -s -Os -ffast-math -DNDEBUG -mconsole -march=pentium4
// EXE = test.exe
// CC = gcc
//
// .PHONY: $(EXE)
// $(EXE): $(DEPEND)
// $(CC) $(CFLAGS) $? -o$@
// $(SHRINK) $@
//
//---------------------------------------------------------------------
#include <stdio.h>
int main()
{
int i;
static float r,g,b;
const char *s = "0 .7 0";
printf("\n\tBefore: r = %f, g = %f, b = %f",r,g,b);
i = sscanf(s,"%f %f %f",&r,&g,&b);
printf("\n\tAfter : r = %f, g = %f, b = %f",r,g,b);
printf("\n\tBackgroundColorString is: `%s`, Return is: %i\n\n",s,i);
return 0;
}
//---------------------------------------------------------------------
The output of <wine test> should be:
Before: r = 0.000000, g = 0.000000, b = 0.000000
After : r = 0.000000, g = 0.700000, b = 0.000000
BackgroundColorString is: `0 .7 0`, Return is: 3
but actually is:
Before: r = 0.000000, g = 0.000000, b = 0.000000
After : r = 0.000000, g = 0.000000, b = 0.000000
BackgroundColorString is: `0 .7 0`, Return is: 1
where the value of g in line 2 has not changed to 0.700000
and the return value of the sscanf function is 1, not 3.
A possible solution might be to insert:
if (nch == '.') {
cur = 0;
goto HANDLE_DECIMALS;
}
directly after /* get first digit. */
in line 265 of original scanf.h and:
HANDLE_DECIMALS:
directly after /* handle decimals */
in line 276 of original scanf.h.
Probably not the best solution, but it works.
By the way; How do I manage to compile *only*
msvcrt.dll.so? I tried make in the msvcrt-dir,
but just the seperate object files were gene-
rated, not the whole library... so I had to
compile the complete wine-suit in order to
get my patched msvcrt.dll.so ;}
Please, drop me a line, if there is a more
simple way to get a single library. Thanks.
With best regards,
Elmar Knittel, elmkni at freenet.de
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
More information about the wine-bugs
mailing list