diff options
author | Jan Dubois <jand@activestate.com> | 2009-11-13 11:45:46 -0800 |
---|---|---|
committer | Jan Dubois <jand@activestate.com> | 2009-11-13 11:47:25 -0800 |
commit | 364d54baf6add9c4667b89e1656f226d0882a843 (patch) | |
tree | d267ba479c710d95e44c14dd1ef3e62239e95ab1 /win32/win32.c | |
parent | fea10cf637669988fe9f4b11a9a5981982c8450a (diff) | |
download | perl-364d54baf6add9c4667b89e1656f226d0882a843.tar.gz |
Support $! stringification of socket error codes on Windows.
The winsock error codes from WSAGetLastError() are stored by
Perl in errno, and there is some code in win32_strerror() that
would stringify them, but that code is never called when Perl
is built with the default WIN32IO_IS_STDIO setting.
This patch enables the win32_strerror() override unconditionally
and also fixes a potential memory corruption issue by using
the FORMAT_MESSAGE_IGNORE_INSERTS flag to ignore any parameter
substitution codes that may be embedded in the error message.
This now works as expected:
C:\git\perl>perl -Ilib -MPOSIX -E "$!=POSIX::EWOULDBLOCK; say $!"
A non-blocking socket operation could not be completed immediately.
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/win32/win32.c b/win32/win32.c index 0302836ea7..050c50cfec 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -64,7 +64,6 @@ typedef struct { #define PERL_NO_GET_CONTEXT #include "XSUB.h" -#include "Win32iop.h" #include <fcntl.h> #ifndef __GNUC__ /* assert.h conflicts with #define of assert in perl.h */ @@ -2623,21 +2622,24 @@ win32_strerror(int e) #if !defined __BORLANDC__ && !defined __MINGW32__ /* compiler intolerance */ extern int sys_nerr; #endif - DWORD source = 0; if (e < 0 || e > sys_nerr) { dTHX; if (e < 0) e = GetLastError(); - if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, &source, e, 0, - w32_strerror_buffer, - sizeof(w32_strerror_buffer), NULL) == 0) + if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e, 0, + w32_strerror_buffer, sizeof(w32_strerror_buffer), + NULL) == 0) + { strcpy(w32_strerror_buffer, "Unknown Error"); - + } return w32_strerror_buffer; } +#undef strerror return strerror(e); +#define strerror win32_strerror } DllExport void |