Mercurial > cpython-lru_cache-weakref
diff Modules/mmapmodule.c @ 52026:79ea0667604b legacy-trunk
Issue #5385: Fixed mmap crash after resize failure on windows.
Now uses NULL instead of INVALID_HANDLE_VALUE as invalid map handle
because CreateFileMapping returns NULL when error occurs.
| author | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> |
|---|---|
| date | Thu, 05 Mar 2009 14:21:12 +0000 |
| parents | 29d652e3f2d3 |
| children | a91cf0defbd6 |
line wrap: on
line diff
--- a/Modules/mmapmodule.c Thu Mar 05 09:34:14 2009 +0000 +++ b/Modules/mmapmodule.c Thu Mar 05 14:21:12 2009 +0000 @@ -112,7 +112,7 @@ #ifdef MS_WINDOWS if (m_obj->data != NULL) UnmapViewOfFile (m_obj->data); - if (m_obj->map_handle != INVALID_HANDLE_VALUE) + if (m_obj->map_handle != NULL) CloseHandle (m_obj->map_handle); if (m_obj->file_handle != INVALID_HANDLE_VALUE) CloseHandle (m_obj->file_handle); @@ -147,9 +147,9 @@ UnmapViewOfFile(self->data); self->data = NULL; } - if (self->map_handle != INVALID_HANDLE_VALUE) { + if (self->map_handle != NULL) { CloseHandle(self->map_handle); - self->map_handle = INVALID_HANDLE_VALUE; + self->map_handle = NULL; } if (self->file_handle != INVALID_HANDLE_VALUE) { CloseHandle(self->file_handle); @@ -173,7 +173,7 @@ #ifdef MS_WINDOWS #define CHECK_VALID(err) \ do { \ - if (self->map_handle == INVALID_HANDLE_VALUE) { \ + if (self->map_handle == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ return err; \ } \ @@ -441,8 +441,10 @@ DWORD off_hi, off_lo, newSizeLow, newSizeHigh; /* First, unmap the file view */ UnmapViewOfFile(self->data); + self->data = NULL; /* Close the mapping object */ CloseHandle(self->map_handle); + self->map_handle = NULL; /* Move to the desired EOF position */ #if SIZEOF_SIZE_T > 4 newSizeHigh = (DWORD)((self->offset + new_size) >> 32); @@ -479,6 +481,8 @@ return Py_None; } else { dwErrCode = GetLastError(); + CloseHandle(self->map_handle); + self->map_handle = NULL; } } else { dwErrCode = GetLastError(); @@ -1279,7 +1283,7 @@ destruct the object in the face of failure */ m_obj->data = NULL; m_obj->file_handle = INVALID_HANDLE_VALUE; - m_obj->map_handle = INVALID_HANDLE_VALUE; + m_obj->map_handle = NULL; m_obj->tagname = NULL; m_obj->offset = offset; @@ -1376,8 +1380,11 @@ m_obj->size); if (m_obj->data != NULL) return (PyObject *)m_obj; - else + else { dwErr = GetLastError(); + CloseHandle(m_obj->map_handle); + m_obj->map_handle = NULL; + } } else dwErr = GetLastError(); Py_DECREF(m_obj);
