More Windows changes.

* After discussion with Trent, all INT_PTR references have been removed in favour of the HANDLE it should always have been.  Trent can see no 64bit issues here.

* In this process, I noticed that the close operation was dangerous, in that we could end up passing bogus results to the Win32 API.  These result of the API functions passed the bogus values were never (and still are not) checked, but this is closer to "the right thing" (tm) than before.

Tested on Windows and Linux.
This commit is contained in:
Mark Hammond 2000-07-30 02:46:26 +00:00
parent 2cbed005b6
commit 071864acb2
1 changed files with 38 additions and 24 deletions

View File

@ -12,7 +12,9 @@
/ Note: This module currently only deals with 32-bit file
/ sizes.
/
/ The latest version of mmapfile is maintained by Sam at
/ This version of mmapmodule.c has been changed significantly
/ from the original mmapfile.c on which it was based.
/ The original version of mmapfile is maintained by Sam at
/ ftp://squirl.nightmare.com/pub/python/python-ext.
*/
@ -24,9 +26,6 @@
#ifdef MS_WIN32
#include <windows.h>
#if _MSC_VER < 1200
#define INT_PTR unsigned long
#endif
#endif
#ifdef UNIX
@ -48,7 +47,7 @@ typedef struct {
#ifdef MS_WIN32
HANDLE map_handle;
INT_PTR file_handle;
HANDLE file_handle;
char * tagname;
#endif
@ -65,8 +64,8 @@ mmap_object_dealloc(mmap_object *m_obj)
UnmapViewOfFile (m_obj->data);
if (m_obj->map_handle != INVALID_HANDLE_VALUE)
CloseHandle (m_obj->map_handle);
if ((HANDLE)m_obj->file_handle != INVALID_HANDLE_VALUE)
CloseHandle ((HANDLE)m_obj->file_handle);
if (m_obj->file_handle != INVALID_HANDLE_VALUE)
CloseHandle (m_obj->file_handle);
if (m_obj->tagname)
PyMem_Free(m_obj->tagname);
#endif /* MS_WIN32 */
@ -87,10 +86,25 @@ mmap_close_method(mmap_object *self, PyObject *args)
if (!PyArg_ParseTuple(args, ":close"))
return NULL;
#ifdef MS_WIN32
UnmapViewOfFile (self->data);
CloseHandle (self->map_handle);
CloseHandle ((HANDLE)self->file_handle);
self->map_handle = (HANDLE) NULL;
/* For each resource we maintain, we need to check
the value is valid, and if so, free the resource
and set the member value to an invalid value so
the dealloc does not attempt to resource clearing
again.
TODO - should we check for errors in the close operations???
*/
if (self->data != NULL) {
UnmapViewOfFile (self->data);
self->data = NULL;
}
if (self->map_handle != INVALID_HANDLE_VALUE) {
CloseHandle (self->map_handle);
self->map_handle = INVALID_HANDLE_VALUE;
}
if (self->file_handle != INVALID_HANDLE_VALUE) {
CloseHandle (self->file_handle);
self->file_handle = INVALID_HANDLE_VALUE;
}
#endif /* MS_WIN32 */
#ifdef UNIX
@ -263,10 +277,10 @@ mmap_size_method(mmap_object *self,
return NULL;
#ifdef MS_WIN32
if (self->file_handle != (INT_PTR) -1) {
if (self->file_handle != INVALID_HANDLE_VALUE) {
return (Py_BuildValue (
"l", (long)
GetFileSize ((HANDLE)self->file_handle, NULL)));
GetFileSize (self->file_handle, NULL)));
} else {
return (Py_BuildValue ("l", (long) self->size) );
}
@ -307,15 +321,15 @@ mmap_resize_method(mmap_object *self,
/* First, unmap the file view */
UnmapViewOfFile (self->data);
/* Close the mapping object */
CloseHandle ((HANDLE)self->map_handle);
CloseHandle (self->map_handle);
/* Move to the desired EOF position */
SetFilePointer ((HANDLE)self->file_handle,
SetFilePointer (self->file_handle,
new_size, NULL, FILE_BEGIN);
/* Change the size of the file */
SetEndOfFile ((HANDLE)self->file_handle);
SetEndOfFile (self->file_handle);
/* Create another mapping object and remap the file view */
self->map_handle = CreateFileMapping (
(HANDLE) self->file_handle,
self->file_handle,
NULL,
PAGE_READWRITE,
0,
@ -802,7 +816,7 @@ new_mmap_object(PyObject *self, PyObject *args)
DWORD dwErr = 0;
int fileno;
INT_PTR fh = 0;
HANDLE fh = 0;
/* Patch the object type */
mmap_object_type.ob_type = &PyType_Type;
@ -821,8 +835,8 @@ new_mmap_object(PyObject *self, PyObject *args)
/* if an actual filename has been specified */
if (fileno != 0) {
fh = _get_osfhandle(fileno);
if (fh==-1) {
fh = (HANDLE)_get_osfhandle(fileno);
if (fh==(HANDLE)-1) {
PyErr_SetFromErrno(mmap_module_error);
return NULL;
}
@ -836,7 +850,7 @@ new_mmap_object(PyObject *self, PyObject *args)
/* Set every field to an invalid marker, so we can safely
destruct the object in the face of failure */
m_obj->data = NULL;
m_obj->file_handle = (INT_PTR)INVALID_HANDLE_VALUE;
m_obj->file_handle = INVALID_HANDLE_VALUE;
m_obj->map_handle = INVALID_HANDLE_VALUE;
m_obj->tagname = NULL;
@ -845,7 +859,7 @@ new_mmap_object(PyObject *self, PyObject *args)
Python code can close it on us */
if (!DuplicateHandle(
GetCurrentProcess(), /* source process handle */
(HANDLE)fh, /* handle to be duplicated */
fh, /* handle to be duplicated */
GetCurrentProcess(), /* target proc handle */
(LPHANDLE)&m_obj->file_handle, /* result */
0, /* access - ignored due to options value */
@ -857,7 +871,7 @@ new_mmap_object(PyObject *self, PyObject *args)
return NULL;
}
if (!map_size) {
m_obj->size = GetFileSize ((HANDLE)fh, NULL);
m_obj->size = GetFileSize (fh, NULL);
} else {
m_obj->size = map_size;
}
@ -882,7 +896,7 @@ new_mmap_object(PyObject *self, PyObject *args)
else
m_obj->tagname = NULL;
m_obj->map_handle = CreateFileMapping ((HANDLE) m_obj->file_handle,
m_obj->map_handle = CreateFileMapping (m_obj->file_handle,
NULL,
PAGE_READWRITE,
0,