Issue #17931: Resolve confusion on Windows between pids and process handles.

This commit is contained in:
Richard Oudkerk 2013-06-05 23:29:30 +01:00
parent 448f1a86ef
commit ac0ad884d1
5 changed files with 29 additions and 23 deletions

View File

@ -52,6 +52,19 @@ PyAPI_FUNC(PyObject *) PyLong_GetInfo(void);
#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" #error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
#endif /* SIZEOF_PID_T */ #endif /* SIZEOF_PID_T */
#if SIZEOF_VOID_P == SIZEOF_INT
# define _Py_PARSE_INTPTR "i"
# define _Py_PARSE_UINTPTR "I"
#elif SIZEOF_VOID_P == SIZEOF_LONG
# define _Py_PARSE_INTPTR "l"
# define _Py_PARSE_UINTPTR "k"
#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG
# define _Py_PARSE_INTPTR "L"
# define _Py_PARSE_UINTPTR "K"
#else
# error "void* different in size from int, long and long long"
#endif /* SIZEOF_VOID_P */
/* Used by Python/mystrtoul.c. */ /* Used by Python/mystrtoul.c. */
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API
PyAPI_DATA(unsigned char) _PyLong_DigitValue[256]; PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];

View File

@ -10,9 +10,8 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #17931: Fix PyLong_FromPid() on Windows 64-bit: processes are - Issue #17931: Resolve confusion on Windows between pids and process
identified by their HANDLE which is a pointer (and not a long, which is handles.
smaller).
- Tweak the exception message when the magic number or size value in a bytecode - Tweak the exception message when the magic number or size value in a bytecode
file is truncated. file is truncated.

View File

@ -5014,11 +5014,7 @@ posix_spawnv(PyObject *self, PyObject *args)
if (spawnval == -1) if (spawnval == -1)
return posix_error(); return posix_error();
else else
#if SIZEOF_LONG == SIZEOF_VOID_P return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
return Py_BuildValue("l", (long) spawnval);
#else
return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
#endif
} }
@ -5104,11 +5100,7 @@ posix_spawnve(PyObject *self, PyObject *args)
if (spawnval == -1) if (spawnval == -1)
(void) posix_error(); (void) posix_error();
else else
#if SIZEOF_LONG == SIZEOF_VOID_P res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
res = Py_BuildValue("l", (long) spawnval);
#else
res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
#endif
while (--envc >= 0) while (--envc >= 0)
PyMem_DEL(envlist[envc]); PyMem_DEL(envlist[envc]);
@ -6178,16 +6170,17 @@ static PyObject *
win32_kill(PyObject *self, PyObject *args) win32_kill(PyObject *self, PyObject *args)
{ {
PyObject *result; PyObject *result;
DWORD pid, sig, err; pid_t pid;
DWORD sig, err;
HANDLE handle; HANDLE handle;
if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig)) if (!PyArg_ParseTuple(args, _Py_PARSE_PID "k:kill", &pid, &sig))
return NULL; return NULL;
/* Console processes which share a common console can be sent CTRL+C or /* Console processes which share a common console can be sent CTRL+C or
CTRL+BREAK events, provided they handle said events. */ CTRL+BREAK events, provided they handle said events. */
if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) { if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
if (GenerateConsoleCtrlEvent(sig, pid) == 0) { if (GenerateConsoleCtrlEvent(sig, (DWORD)pid) == 0) {
err = GetLastError(); err = GetLastError();
PyErr_SetFromWindowsErr(err); PyErr_SetFromWindowsErr(err);
} }
@ -6197,7 +6190,7 @@ win32_kill(PyObject *self, PyObject *args)
/* If the signal is outside of what GenerateConsoleCtrlEvent can use, /* If the signal is outside of what GenerateConsoleCtrlEvent can use,
attempt to open and terminate the process. */ attempt to open and terminate the process. */
handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);
if (handle == NULL) { if (handle == NULL) {
err = GetLastError(); err = GetLastError();
return PyErr_SetFromWindowsErr(err); return PyErr_SetFromWindowsErr(err);
@ -6603,7 +6596,7 @@ posix_waitpid(PyObject *self, PyObject *args)
Py_intptr_t pid; Py_intptr_t pid;
int status, options; int status, options;
if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options)) if (!PyArg_ParseTuple(args, _Py_PARSE_INTPTR "i:waitpid", &pid, &options))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
pid = _cwait(&status, pid, options); pid = _cwait(&status, pid, options);
@ -6612,7 +6605,7 @@ posix_waitpid(PyObject *self, PyObject *args)
return posix_error(); return posix_error();
/* shift the status left a byte so this is more like the POSIX waitpid */ /* shift the status left a byte so this is more like the POSIX waitpid */
return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8); return Py_BuildValue(_Py_PARSE_INTPTR "i", pid, status << 8);
} }
#endif /* HAVE_WAITPID || HAVE_CWAIT */ #endif /* HAVE_WAITPID || HAVE_CWAIT */

View File

@ -113,11 +113,12 @@ os.O_BINARY.");
static PyObject * static PyObject *
msvcrt_open_osfhandle(PyObject *self, PyObject *args) msvcrt_open_osfhandle(PyObject *self, PyObject *args)
{ {
long handle; Py_intptr_t handle;
int flags; int flags;
int fd; int fd;
if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags)) if (!PyArg_ParseTuple(args, _Py_PARSE_INTPTR "i:open_osfhandle",
&handle, &flags))
return NULL; return NULL;
fd = _open_osfhandle(handle, flags); fd = _open_osfhandle(handle, flags);

View File

@ -723,8 +723,8 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* The size of `wchar_t', as computed by sizeof. */ /* The size of `wchar_t', as computed by sizeof. */
#define SIZEOF_WCHAR_T 2 #define SIZEOF_WCHAR_T 2
/* The size of `pid_t' (HANDLE). */ /* The size of `pid_t', as computed by sizeof. */
#define SIZEOF_PID_T SIZEOF_VOID_P #define SIZEOF_PID_T SIZEOF_INT
/* Define if you have the dl library (-ldl). */ /* Define if you have the dl library (-ldl). */
/* #undef HAVE_LIBDL */ /* #undef HAVE_LIBDL */