summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorJan Dubois <jand@activestate.com>2010-12-06 18:16:39 -0800
committerJan Dubois <jand@activestate.com>2010-12-06 18:16:39 -0800
commit9b1f18150adf6630261f4d4a81b0a75ba6abaf97 (patch)
tree3ee3b10609c9924c1f63a82536015fc5f9abe257 /win32
parent7ffd65862d23d0e5ffc41b235289620311737612 (diff)
downloadperl-9b1f18150adf6630261f4d4a81b0a75ba6abaf97.tar.gz
Get rid of PERL_MSVCRT_READFIX
The code works around a bug in very old versions of MSVCRT.dll. The issue has been fixed a long time ago by Microsoft, so anyone who has installed a Windows Service Pack in the last 10 years or so won't be affected by the problem.
Diffstat (limited to 'win32')
-rw-r--r--win32/Makefile7
-rw-r--r--win32/makefile.mk11
-rw-r--r--win32/win32.c200
-rw-r--r--win32/win32.h53
-rw-r--r--win32/win32sck.c6
5 files changed, 1 insertions, 276 deletions
diff --git a/win32/Makefile b/win32/Makefile
index 248c6852c0..c60a61de5d 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -473,13 +473,6 @@ BUILDOPT = $(BUILDOPT) -D_USE_32BIT_TIME_T
! ENDIF
!ENDIF
-# Use the MSVCRT read() fix only when using VC++ 6.x or earlier. Later
-# versions use MSVCR70.dll, MSVCR71.dll, etc, which do not require the
-# fix.
-!IF "$(CCTYPE)" == "MSVC60"
-BUILDOPT = $(BUILDOPT) -DPERL_MSVCRT_READFIX
-!ENDIF
-
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
diff --git a/win32/makefile.mk b/win32/makefile.mk
index fe845c255c..30dafb8cc9 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -555,9 +555,7 @@ OBJOUT_FLAG = -o
EXEOUT_FLAG = -o
LIBOUT_FLAG =
-# NOTE: we assume that GCC uses MSVCRT.DLL
-# See comments about PERL_MSVCRT_READFIX in the "cl" compiler section below.
-BUILDOPT += -fno-strict-aliasing -mms-bitfields -DPERL_MSVCRT_READFIX
+BUILDOPT += -fno-strict-aliasing -mms-bitfields
.ELSE
@@ -631,13 +629,6 @@ BUILDOPT += -D_USE_32BIT_TIME_T
.ENDIF
.ENDIF
-# Use the MSVCRT read() fix only when using VC++ 6.x or earlier. Later
-# versions use MSVCR70.dll, MSVCR71.dll, etc, which do not require the
-# fix.
-.IF "$(CCTYPE)" == "MSVC60"
-BUILDOPT += -DPERL_MSVCRT_READFIX
-.ENDIF
-
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
diff --git a/win32/win32.c b/win32/win32.c
index 13f6b3374b..721f4d6406 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -3171,210 +3171,10 @@ win32_dup2(int fd1,int fd2)
return dup2(fd1,fd2);
}
-#ifdef PERL_MSVCRT_READFIX
-
-#define LF 10 /* line feed */
-#define CR 13 /* carriage return */
-#define CTRLZ 26 /* ctrl-z means eof for text */
-#define FOPEN 0x01 /* file handle open */
-#define FEOFLAG 0x02 /* end of file has been encountered */
-#define FCRLF 0x04 /* CR-LF across read buffer (in text mode) */
-#define FPIPE 0x08 /* file handle refers to a pipe */
-#define FAPPEND 0x20 /* file handle opened O_APPEND */
-#define FDEV 0x40 /* file handle refers to device */
-#define FTEXT 0x80 /* file handle is in text mode */
-#define MAX_DESCRIPTOR_COUNT (64*32) /* this is the maximun that MSVCRT can handle */
-
-int __cdecl
-_fixed_read(int fh, void *buf, unsigned cnt)
-{
- int bytes_read; /* number of bytes read */
- char *buffer; /* buffer to read to */
- int os_read; /* bytes read on OS call */
- char *p, *q; /* pointers into buffer */
- char peekchr; /* peek-ahead character */
- ULONG filepos; /* file position after seek */
- ULONG dosretval; /* o.s. return value */
-
- /* validate handle */
- if (((unsigned)fh >= (unsigned)MAX_DESCRIPTOR_COUNT) ||
- !(_osfile(fh) & FOPEN))
- {
- /* out of range -- return error */
- errno = EBADF;
- _doserrno = 0; /* not o.s. error */
- return -1;
- }
-
- /*
- * If lockinitflag is FALSE, assume fd is device
- * lockinitflag is set to TRUE by open.
- */
- if (_pioinfo(fh)->lockinitflag)
- EnterCriticalSection(&(_pioinfo(fh)->lock)); /* lock file */
-
- bytes_read = 0; /* nothing read yet */
- buffer = (char*)buf;
-
- if (cnt == 0 || (_osfile(fh) & FEOFLAG)) {
- /* nothing to read or at EOF, so return 0 read */
- goto functionexit;
- }
-
- if ((_osfile(fh) & (FPIPE|FDEV)) && _pipech(fh) != LF) {
- /* a pipe/device and pipe lookahead non-empty: read the lookahead
- * char */
- *buffer++ = _pipech(fh);
- ++bytes_read;
- --cnt;
- _pipech(fh) = LF; /* mark as empty */
- }
-
- /* read the data */
-
- if (!ReadFile((HANDLE)_osfhnd(fh), buffer, cnt, (LPDWORD)&os_read, NULL))
- {
- /* ReadFile has reported an error. recognize two special cases.
- *
- * 1. map ERROR_ACCESS_DENIED to EBADF
- *
- * 2. just return 0 if ERROR_BROKEN_PIPE has occurred. it
- * means the handle is a read-handle on a pipe for which
- * all write-handles have been closed and all data has been
- * read. */
-
- if ((dosretval = GetLastError()) == ERROR_ACCESS_DENIED) {
- /* wrong read/write mode should return EBADF, not EACCES */
- errno = EBADF;
- _doserrno = dosretval;
- bytes_read = -1;
- goto functionexit;
- }
- else if (dosretval == ERROR_BROKEN_PIPE) {
- bytes_read = 0;
- goto functionexit;
- }
- else {
- bytes_read = -1;
- goto functionexit;
- }
- }
-
- bytes_read += os_read; /* update bytes read */
-
- if (_osfile(fh) & FTEXT) {
- /* now must translate CR-LFs to LFs in the buffer */
-
- /* set CRLF flag to indicate LF at beginning of buffer */
- /* if ((os_read != 0) && (*(char *)buf == LF)) */
- /* _osfile(fh) |= FCRLF; */
- /* else */
- /* _osfile(fh) &= ~FCRLF; */
-
- _osfile(fh) &= ~FCRLF;
-
- /* convert chars in the buffer: p is src, q is dest */
- p = q = (char*)buf;
- while (p < (char *)buf + bytes_read) {
- if (*p == CTRLZ) {
- /* if fh is not a device, set ctrl-z flag */
- if (!(_osfile(fh) & FDEV))
- _osfile(fh) |= FEOFLAG;
- break; /* stop translating */
- }
- else if (*p != CR)
- *q++ = *p++;
- else {
- /* *p is CR, so must check next char for LF */
- if (p < (char *)buf + bytes_read - 1) {
- if (*(p+1) == LF) {
- p += 2;
- *q++ = LF; /* convert CR-LF to LF */
- }
- else
- *q++ = *p++; /* store char normally */
- }
- else {
- /* This is the hard part. We found a CR at end of
- buffer. We must peek ahead to see if next char
- is an LF. */
- ++p;
-
- dosretval = 0;
- if (!ReadFile((HANDLE)_osfhnd(fh), &peekchr, 1,
- (LPDWORD)&os_read, NULL))
- dosretval = GetLastError();
-
- if (dosretval != 0 || os_read == 0) {
- /* couldn't read ahead, store CR */
- *q++ = CR;
- }
- else {
- /* peekchr now has the extra character -- we now
- have several possibilities:
- 1. disk file and char is not LF; just seek back
- and copy CR
- 2. disk file and char is LF; store LF, don't seek back
- 3. pipe/device and char is LF; store LF.
- 4. pipe/device and char isn't LF, store CR and
- put char in pipe lookahead buffer. */
- if (_osfile(fh) & (FDEV|FPIPE)) {
- /* non-seekable device */
- if (peekchr == LF)
- *q++ = LF;
- else {
- *q++ = CR;
- _pipech(fh) = peekchr;
- }
- }
- else {
- /* disk file */
- if (peekchr == LF) {
- /* nothing read yet; must make some
- progress */
- *q++ = LF;
- /* turn on this flag for tell routine */
- _osfile(fh) |= FCRLF;
- }
- else {
- HANDLE osHandle; /* o.s. handle value */
- /* seek back */
- if ((osHandle = (HANDLE)_get_osfhandle(fh)) != (HANDLE)-1)
- {
- if ((filepos = SetFilePointer(osHandle, -1, NULL, FILE_CURRENT)) == -1)
- dosretval = GetLastError();
- }
- if (peekchr != LF)
- *q++ = CR;
- }
- }
- }
- }
- }
- }
-
- /* we now change bytes_read to reflect the true number of chars
- in the buffer */
- bytes_read = q - (char *)buf;
- }
-
-functionexit:
- if (_pioinfo(fh)->lockinitflag)
- LeaveCriticalSection(&(_pioinfo(fh)->lock)); /* unlock file */
-
- return bytes_read;
-}
-
-#endif /* PERL_MSVCRT_READFIX */
-
DllExport int
win32_read(int fd, void *buf, unsigned int cnt)
{
-#ifdef PERL_MSVCRT_READFIX
- return _fixed_read(fd, buf, cnt);
-#else
return read(fd, buf, cnt);
-#endif
}
DllExport int
diff --git a/win32/win32.h b/win32/win32.h
index 5be01254df..0d55d640df 100644
--- a/win32/win32.h
+++ b/win32/win32.h
@@ -518,59 +518,6 @@ DllExport int win32_async_check(pTHX);
} STMT_END
#endif
-#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
-#ifdef PERL_CORE
-
-/* C doesn't like repeat struct definitions */
-#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
-#undef _CRTIMP
-#endif
-#ifndef _CRTIMP
-#define _CRTIMP __declspec(dllimport)
-#endif
-
-/*
- * Control structure for lowio file handles
- */
-typedef struct {
- intptr_t osfhnd;/* underlying OS file HANDLE */
- char osfile; /* attributes of file (e.g., open in text mode?) */
- char pipech; /* one char buffer for handles opened on pipes */
- int lockinitflag;
- CRITICAL_SECTION lock;
-} ioinfo;
-
-
-/*
- * Array of arrays of control structures for lowio files.
- */
-EXTERN_C _CRTIMP ioinfo* __pioinfo[];
-
-/*
- * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
- * array of ioinfo structs.
- */
-#define IOINFO_L2E 5
-
-/*
- * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
- */
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-
-/*
- * Access macros for getting at an ioinfo struct and its fields from a
- * file handle
- */
-#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfhnd(i) (_pioinfo(i)->osfhnd)
-#define _osfile(i) (_pioinfo(i)->osfile)
-#define _pipech(i) (_pioinfo(i)->pipech)
-
-/* since we are not doing a dup2(), this works fine */
-#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
-#endif
-#endif
-
/* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
#if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
#undef PERLIO_NOT_STDIO
diff --git a/win32/win32sck.c b/win32/win32sck.c
index 8dbeeb6487..22cc72eefa 100644
--- a/win32/win32sck.c
+++ b/win32/win32sck.c
@@ -473,9 +473,6 @@ int my_close(int fd)
int err;
err = closesocket(osf);
if (err == 0) {
-#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
- _set_osfhnd(fd, INVALID_HANDLE_VALUE);
-#endif
(void)close(fd); /* handle already closed, ignore error */
return 0;
}
@@ -504,9 +501,6 @@ my_fclose (FILE *pf)
win32_fflush(pf);
err = closesocket(osf);
if (err == 0) {
-#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
- _set_osfhnd(win32_fileno(pf), INVALID_HANDLE_VALUE);
-#endif
(void)fclose(pf); /* handle already closed, ignore error */
return 0;
}