mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
Merging r70958 from the trunk, regarding http://bugs.python.org/issue5623
This commit is contained in:
parent
847f30e2bc
commit
f64e6514d7
1 changed files with 23 additions and 38 deletions
|
@ -263,6 +263,7 @@ extern int lstat(const char *, struct stat *);
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#endif
|
#endif
|
||||||
#include "osdefs.h"
|
#include "osdefs.h"
|
||||||
|
#include <malloc.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <shellapi.h> /* for ShellExecute() */
|
#include <shellapi.h> /* for ShellExecute() */
|
||||||
#endif /* _MSC_VER */
|
#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
|
* (all of this is to avoid globally modifying the CRT behaviour using
|
||||||
* _set_invalid_parameter_handler() and _CrtSetReportMode())
|
* _set_invalid_parameter_handler() and _CrtSetReportMode())
|
||||||
*/
|
*/
|
||||||
#if _MSC_VER >= 1500 /* VS 2008 */
|
/* The actual size of the structure is determined at runtime.
|
||||||
|
* Only the first items must be present.
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
intptr_t osfhnd;
|
intptr_t osfhnd;
|
||||||
char osfile;
|
char osfile;
|
||||||
char pipech;
|
} my_ioinfo;
|
||||||
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 */
|
|
||||||
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[];
|
extern __declspec(dllimport) char * __pioinfo[];
|
||||||
#define IOINFO_L2E 5
|
#define IOINFO_L2E 5
|
||||||
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
|
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
|
||||||
#define IOINFO_ARRAYS 64
|
#define IOINFO_ARRAYS 64
|
||||||
|
@ -406,6 +375,19 @@ _PyVerify_fd(int fd)
|
||||||
{
|
{
|
||||||
const int i1 = fd >> IOINFO_L2E;
|
const int i1 = fd >> IOINFO_L2E;
|
||||||
const int i2 = fd & ((1 << IOINFO_L2E) - 1);
|
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 */
|
/* See that it isn't a special CLEAR fileno */
|
||||||
if (fd != _NO_CONSOLE_FILENO) {
|
if (fd != _NO_CONSOLE_FILENO) {
|
||||||
|
@ -414,10 +396,13 @@ _PyVerify_fd(int fd)
|
||||||
*/
|
*/
|
||||||
if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
|
if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
|
||||||
/* finally, check that the file is open */
|
/* 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;
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fail:
|
||||||
errno = EBADF;
|
errno = EBADF;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue