BUG: _read() Returns -1 When Reading Last Byte of a Segment

Last reviewed: July 22, 1997
Article ID: Q120153
1.00 1.50 WINDOWS kbprg kbbuglist

The information in this article applies to:

  • The C Run-time (CRT) included with:

        - Microsoft C version 6.0, 6.0a, 6.0ax
        - Microsoft C/C++ version 7.0
        - Microsoft Visual C++ for Windows, versions 1.0 and 1.5
    

SYMPTOMS

If you open a file with _open() specifying O_TEXT mode or letting it default to O_TEXT mode and then you call _read() to read to the last byte of a segment, the _read() function returns -1. Though this return value indicates that an error occurred, the information was read correctly.

CAUSE

The carry flag is unexpectedly set when looking for carriage return, line feed (CR/LF) pairs at 0xFFFF. The Run-Time incorrectly interprets this as an error and returns -1 instead of the number of characters read.

STATUS

Microsoft has confirmed this to be a bug in the products listed above. We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

MORE INFORMATION

The following sample code illustrates the problem:

Sample Code

/* Compile options needed: /AL
*/

   #include <stdio.h>
   #include <fcntl.h>
   #include <sys\types.h>
   #include <sys\stat.h>
   #include <malloc.h>
   #include <io.h>
   #include <dos.h>
   #include <errno.h>

   int hfIn;
   int ret_val;
   char huge* lpcBase;
   char huge* lpcTest;

   void main(void)
   {
      lpcBase = (char _huge*) halloc(100000L, 1);
      lpcTest= lpcBase;
      FP_OFF(lpcTest)= 0xFFFC;   // Point to end of the segment.

      hfIn = open("C:\\config.sys", _O_RDONLY);
      ret_val = read(hfIn, lpcTest, 4);
      if (ret_val< 0)
      {
         printf ("ret_val = %i indicating Failure Reading to 0xFFFF\n",
                  ret_val);
         printf ("errno = %d\n", errno);
      }
      close(hfIn);
   }


Additional reference words: 6.00 6.00a 6.00ax 7.00 7.00a 1.00 1.50
KBCategory: kbprg kbbuglist
KBSubcategory: CRTIss
Keywords : kb16bitonly


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 22, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.