summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorKristján Valur Jónsson <kristjan@ccpgames.com>2009-04-13 10:16:14 (GMT)
committerKristján Valur Jónsson <kristjan@ccpgames.com>2009-04-13 10:16:14 (GMT)
commitf64e6514d772edcdb28c2ae9655d02a7f74ece30 (patch)
tree997ef76c6af06c6064b661fdb4ca544ba63c6d00 /Modules/posixmodule.c
parent847f30e2bc83a35ff1d15e5409004dcaff7c88b4 (diff)
downloadcpython-f64e6514d772edcdb28c2ae9655d02a7f74ece30.zip
cpython-f64e6514d772edcdb28c2ae9655d02a7f74ece30.tar.gz
cpython-f64e6514d772edcdb28c2ae9655d02a7f74ece30.tar.bz2
Merging r70958 from the trunk, regarding http://bugs.python.org/issue5623
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c63
1 files changed, 24 insertions, 39 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 7b32eda..7b8c057 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -263,6 +263,7 @@ extern int lstat(const char *, struct stat *);
#include <process.h>
#endif
#include "osdefs.h"
+#include <malloc.h>
#include <windows.h>
#include <shellapi.h> /* for ShellExecute() */
#endif /* _MSC_VER */
@@ -352,47 +353,15 @@ extern int lstat(const char *, struct stat *);
* (all of this is to avoid globally modifying the CRT behaviour using
* _set_invalid_parameter_handler() and _CrtSetReportMode())
*/
-#if _MSC_VER >= 1500 /* VS 2008 */
-typedef struct {
- intptr_t osfhnd;
- char osfile;
- char pipech;
- int lockinitflag;
- CRITICAL_SECTION lock;
-#ifndef _SAFECRT_IMPL
- char textmode : 7;
- char unicode : 1;
- char pipech2[2];
- __int64 startpos;
- BOOL utf8translations;
- char dbcsBuffer;
- BOOL dbcsBufferUsed;
-#endif /* _SAFECRT_IMPL */
- } ioinfo;
-#elif _MSC_VER >= 1400 /* VS 2005 */
+/* The actual size of the structure is determined at runtime.
+ * Only the first items must be present.
+ */
typedef struct {
intptr_t osfhnd;
char osfile;
- char pipech;
- int lockinitflag;
- CRITICAL_SECTION lock;
-#ifndef _SAFECRT_IMPL
- char textmode : 7;
- char unicode : 1;
- char pipech2[2];
- __int64 startpos;
- BOOL utf8translations;
-#ifndef _DEBUG
- /* padding hack. 8 byte extra length observed at
- * runtime, for 32 and 64 bits when not in _DEBUG
- */
- __int32 _padding[2];
-#endif
-#endif /* _SAFECRT_IMPL */
- } ioinfo;
-#endif
-
-extern __declspec(dllimport) ioinfo * __pioinfo[];
+} my_ioinfo;
+
+extern __declspec(dllimport) char * __pioinfo[];
#define IOINFO_L2E 5
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
#define IOINFO_ARRAYS 64
@@ -406,6 +375,19 @@ _PyVerify_fd(int fd)
{
const int i1 = fd >> IOINFO_L2E;
const int i2 = fd & ((1 << IOINFO_L2E) - 1);
+
+ static int sizeof_ioinfo = 0;
+
+ /* Determine the actual size of the ioinfo structure,
+ * as used by the CRT loaded in memory
+ */
+ if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) {
+ sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
+ }
+ if (sizeof_ioinfo == 0) {
+ /* This should not happen... */
+ goto fail;
+ }
/* See that it isn't a special CLEAR fileno */
if (fd != _NO_CONSOLE_FILENO) {
@@ -414,10 +396,13 @@ _PyVerify_fd(int fd)
*/
if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
/* finally, check that the file is open */
- if (__pioinfo[i1][i2].osfile & FOPEN)
+ my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
+ if (info->osfile & FOPEN) {
return 1;
+ }
}
}
+ fail:
errno = EBADF;
return 0;
}