Kaydet (Commit) b90f4e87 authored tarafından Gregory P. Smith's avatar Gregory P. Smith

fix issue3120 - don't truncate handles on 64-bit Windows.

This is still messy, realistically PC/_subprocess.c should never cast pointers
to python numbers and back at all.

I don't have a 64-bit windows build environment because microsoft apparently
thinks that should cost money.  Time to watch the buildbots.  It builds and
passes tests on 32-bit windows.
üst f1f46f03
...@@ -141,6 +141,8 @@ Library ...@@ -141,6 +141,8 @@ Library
up in the child process to prevent deadlock and report proper thread counts up in the child process to prevent deadlock and report proper thread counts
if the new process uses the threading module. if the new process uses the threading module.
- Issue #3120: On 64-bit Windows the subprocess module was truncating handles.
Tests Tests
----- -----
......
...@@ -69,6 +69,14 @@ sp_handle_new(HANDLE handle) ...@@ -69,6 +69,14 @@ sp_handle_new(HANDLE handle)
return (PyObject*) self; return (PyObject*) self;
} }
#if defined(MS_WIN32) && !defined(MS_WIN64)
#define HANDLE_TO_PYNUM(handle) PyInt_FromLong((long) handle)
#define PY_HANDLE_PARAM "l"
#else
#define HANDLE_TO_PYNUM(handle) PyLong_FromLongLong((long long) handle)
#define PY_HANDLE_PARAM "L"
#endif
static PyObject* static PyObject*
sp_handle_detach(sp_handle_object* self, PyObject* args) sp_handle_detach(sp_handle_object* self, PyObject* args)
{ {
...@@ -82,7 +90,7 @@ sp_handle_detach(sp_handle_object* self, PyObject* args) ...@@ -82,7 +90,7 @@ sp_handle_detach(sp_handle_object* self, PyObject* args)
self->handle = NULL; self->handle = NULL;
/* note: return the current handle, as an integer */ /* note: return the current handle, as an integer */
return PyInt_FromLong((long) handle); return HANDLE_TO_PYNUM(handle);
} }
static PyObject* static PyObject*
...@@ -122,7 +130,7 @@ sp_handle_getattr(sp_handle_object* self, char* name) ...@@ -122,7 +130,7 @@ sp_handle_getattr(sp_handle_object* self, char* name)
static PyObject* static PyObject*
sp_handle_as_int(sp_handle_object* self) sp_handle_as_int(sp_handle_object* self)
{ {
return PyInt_FromLong((long) self->handle); return HANDLE_TO_PYNUM(self->handle);
} }
static PyNumberMethods sp_handle_as_number; static PyNumberMethods sp_handle_as_number;
...@@ -168,7 +176,7 @@ sp_GetStdHandle(PyObject* self, PyObject* args) ...@@ -168,7 +176,7 @@ sp_GetStdHandle(PyObject* self, PyObject* args)
} }
/* note: returns integer, not handle object */ /* note: returns integer, not handle object */
return PyInt_FromLong((long) handle); return HANDLE_TO_PYNUM(handle);
} }
static PyObject * static PyObject *
...@@ -186,14 +194,16 @@ sp_DuplicateHandle(PyObject* self, PyObject* args) ...@@ -186,14 +194,16 @@ sp_DuplicateHandle(PyObject* self, PyObject* args)
HANDLE target_handle; HANDLE target_handle;
BOOL result; BOOL result;
long source_process_handle; HANDLE source_process_handle;
long source_handle; HANDLE source_handle;
long target_process_handle; HANDLE target_process_handle;
int desired_access; int desired_access;
int inherit_handle; int inherit_handle;
int options = 0; int options = 0;
if (! PyArg_ParseTuple(args, "lllii|i:DuplicateHandle", if (! PyArg_ParseTuple(args,
PY_HANDLE_PARAM PY_HANDLE_PARAM PY_HANDLE_PARAM
"ii|i:DuplicateHandle",
&source_process_handle, &source_process_handle,
&source_handle, &source_handle,
&target_process_handle, &target_process_handle,
...@@ -204,9 +214,9 @@ sp_DuplicateHandle(PyObject* self, PyObject* args) ...@@ -204,9 +214,9 @@ sp_DuplicateHandle(PyObject* self, PyObject* args)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
result = DuplicateHandle( result = DuplicateHandle(
(HANDLE) source_process_handle, source_process_handle,
(HANDLE) source_handle, source_handle,
(HANDLE) target_process_handle, target_process_handle,
&target_handle, &target_handle,
desired_access, desired_access,
inherit_handle, inherit_handle,
...@@ -436,13 +446,13 @@ sp_TerminateProcess(PyObject* self, PyObject* args) ...@@ -436,13 +446,13 @@ sp_TerminateProcess(PyObject* self, PyObject* args)
{ {
BOOL result; BOOL result;
long process; HANDLE process;
int exit_code; int exit_code;
if (! PyArg_ParseTuple(args, "li:TerminateProcess", &process, if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:TerminateProcess",
&exit_code)) &process, &exit_code))
return NULL; return NULL;
result = TerminateProcess((HANDLE) process, exit_code); result = TerminateProcess(process, exit_code);
if (! result) if (! result)
return PyErr_SetFromWindowsErr(GetLastError()); return PyErr_SetFromWindowsErr(GetLastError());
...@@ -457,11 +467,11 @@ sp_GetExitCodeProcess(PyObject* self, PyObject* args) ...@@ -457,11 +467,11 @@ sp_GetExitCodeProcess(PyObject* self, PyObject* args)
DWORD exit_code; DWORD exit_code;
BOOL result; BOOL result;
long process; HANDLE process;
if (! PyArg_ParseTuple(args, "l:GetExitCodeProcess", &process)) if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetExitCodeProcess", &process))
return NULL; return NULL;
result = GetExitCodeProcess((HANDLE) process, &exit_code); result = GetExitCodeProcess(process, &exit_code);
if (! result) if (! result)
return PyErr_SetFromWindowsErr(GetLastError()); return PyErr_SetFromWindowsErr(GetLastError());
...@@ -474,15 +484,15 @@ sp_WaitForSingleObject(PyObject* self, PyObject* args) ...@@ -474,15 +484,15 @@ sp_WaitForSingleObject(PyObject* self, PyObject* args)
{ {
DWORD result; DWORD result;
long handle; HANDLE handle;
int milliseconds; int milliseconds;
if (! PyArg_ParseTuple(args, "li:WaitForSingleObject", if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:WaitForSingleObject",
&handle, &handle,
&milliseconds)) &milliseconds))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
result = WaitForSingleObject((HANDLE) handle, (DWORD) milliseconds); result = WaitForSingleObject(handle, (DWORD) milliseconds);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (result == WAIT_FAILED) if (result == WAIT_FAILED)
...@@ -504,13 +514,14 @@ static PyObject * ...@@ -504,13 +514,14 @@ static PyObject *
sp_GetModuleFileName(PyObject* self, PyObject* args) sp_GetModuleFileName(PyObject* self, PyObject* args)
{ {
BOOL result; BOOL result;
long module; HMODULE module;
TCHAR filename[MAX_PATH]; TCHAR filename[MAX_PATH];
if (! PyArg_ParseTuple(args, "l:GetModuleFileName", &module)) if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetModuleFileName",
&module))
return NULL; return NULL;
result = GetModuleFileName((HMODULE)module, filename, MAX_PATH); result = GetModuleFileName(module, filename, MAX_PATH);
filename[MAX_PATH-1] = '\0'; filename[MAX_PATH-1] = '\0';
if (! result) if (! result)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment