]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merging r70958 from the trunk, regarding http://bugs.python.org/issue5623
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Mon, 13 Apr 2009 10:16:14 +0000 (10:16 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Mon, 13 Apr 2009 10:16:14 +0000 (10:16 +0000)
Modules/posixmodule.c

index 7b32edac3dd4ff4215070837d4f4926fe1f1562a..7b8c0574199375c92e2e0456b693111733f1f6ec 100644 (file)
@@ -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;
 }