An MSVCRT_fgetc bug

Tobias Ringström tobias at swedot.se
Mon Sep 25 03:04:00 CDT 2006


There's a bug in MSVCRT_fgetc in 0.9.21 (likely introduced in 0.9.19) in 
that it sometimes sign extends the byte read from the file. The 
following program illustrates the problem:

    #include <stdio.h>

    int
    main()
    {
        FILE *f = fopen("tmp.bin", "w+");

        fputc(0xe0, f);
        fputc(0xe0, f);
        rewind(f);
        printf("0x%08x\n", fgetc(f));
        printf("0x%08x\n", fgetc(f));
        fclose(f);

        return 0;
    }
      

The output is:

    0x000000e0
    0xffffffe0         (should be 0x000000e0 too)
      

The bug is likely this line:

http://source.winehq.org/source/dlls/msvcrt/file.c#L2134

That line is now

    i = file->_ptr++;

but should be

    i = *(unsigned char*)(file->_ptr++);

I don't have a build environment for Wine, and it felt like overkill to 
set one up for this little bug, so I've not been able to verify my 
hypothesis. I hope that's acceptable.

/Tobias




More information about the wine-devel mailing list