32
32
# include <unistd.h> // close()
33
33
#endif
34
34
35
- // to support MS_WINDOWS_SYSTEM OpenFileMappingA / CreateFileMappingA
36
- // need to be replaced with OpenFileMappingW / CreateFileMappingW
37
- #if !defined(MS_WINDOWS ) || defined(MS_WINDOWS_DESKTOP ) || defined(MS_WINDOWS_GAMES )
38
-
39
35
#ifndef MS_WINDOWS
40
36
#define UNIX
41
37
# ifdef HAVE_FCNTL_H
@@ -116,7 +112,7 @@ typedef struct {
116
112
#ifdef MS_WINDOWS
117
113
HANDLE map_handle ;
118
114
HANDLE file_handle ;
119
- char * tagname ;
115
+ wchar_t * tagname ;
120
116
#endif
121
117
122
118
#ifdef UNIX
@@ -534,7 +530,7 @@ mmap_resize_method(mmap_object *self,
534
530
CloseHandle (self -> map_handle );
535
531
/* if the file mapping still exists, it cannot be resized. */
536
532
if (self -> tagname ) {
537
- self -> map_handle = OpenFileMappingA (FILE_MAP_WRITE , FALSE,
533
+ self -> map_handle = OpenFileMappingW (FILE_MAP_WRITE , FALSE,
538
534
self -> tagname );
539
535
if (self -> map_handle ) {
540
536
PyErr_SetFromWindowsErr (ERROR_USER_MAPPED_FILE );
@@ -563,7 +559,7 @@ mmap_resize_method(mmap_object *self,
563
559
564
560
/* create a new file mapping and map a new view */
565
561
/* FIXME: call CreateFileMappingW with wchar_t tagname */
566
- self -> map_handle = CreateFileMappingA (
562
+ self -> map_handle = CreateFileMappingW (
567
563
self -> file_handle ,
568
564
NULL ,
569
565
PAGE_READWRITE ,
@@ -845,7 +841,7 @@ mmap__sizeof__method(mmap_object *self, void *Py_UNUSED(ignored))
845
841
{
846
842
size_t res = _PyObject_SIZE (Py_TYPE (self ));
847
843
if (self -> tagname ) {
848
- res += strlen ( self -> tagname ) + 1 ;
844
+ res += ( wcslen ( self -> tagname ) + 1 ) * sizeof ( self -> tagname [ 0 ]) ;
849
845
}
850
846
return PyLong_FromSize_t (res );
851
847
}
@@ -1400,7 +1396,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1400
1396
DWORD off_lo ; /* lower 32 bits of offset */
1401
1397
DWORD size_hi ; /* upper 32 bits of size */
1402
1398
DWORD size_lo ; /* lower 32 bits of size */
1403
- const char * tagname = "" ;
1399
+ PyObject * tagname = Py_None ;
1404
1400
DWORD dwErr = 0 ;
1405
1401
int fileno ;
1406
1402
HANDLE fh = 0 ;
@@ -1410,7 +1406,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1410
1406
"tagname" ,
1411
1407
"access" , "offset" , NULL };
1412
1408
1413
- if (!PyArg_ParseTupleAndKeywords (args , kwdict , "in|ziL " , keywords ,
1409
+ if (!PyArg_ParseTupleAndKeywords (args , kwdict , "in|OiL " , keywords ,
1414
1410
& fileno , & map_size ,
1415
1411
& tagname , & access , & offset )) {
1416
1412
return NULL ;
@@ -1543,17 +1539,19 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1543
1539
m_obj -> weakreflist = NULL ;
1544
1540
m_obj -> exports = 0 ;
1545
1541
/* set the tag name */
1546
- if (tagname != NULL && * tagname != '\0' ) {
1547
- m_obj -> tagname = PyMem_Malloc (strlen (tagname )+ 1 );
1542
+ if (!Py_IsNone (tagname )) {
1543
+ if (!PyUnicode_Check (tagname )) {
1544
+ Py_DECREF (m_obj );
1545
+ return PyErr_Format (PyExc_TypeError , "expected str or None for "
1546
+ "'tagname', not %.200s" ,
1547
+ Py_TYPE (tagname )-> tp_name );
1548
+ }
1549
+ m_obj -> tagname = PyUnicode_AsWideCharString (tagname , NULL );
1548
1550
if (m_obj -> tagname == NULL ) {
1549
- PyErr_NoMemory ();
1550
1551
Py_DECREF (m_obj );
1551
1552
return NULL ;
1552
1553
}
1553
- strcpy (m_obj -> tagname , tagname );
1554
1554
}
1555
- else
1556
- m_obj -> tagname = NULL ;
1557
1555
1558
1556
m_obj -> access = (access_mode )access ;
1559
1557
size_hi = (DWORD )(size >> 32 );
@@ -1562,7 +1560,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1562
1560
off_lo = (DWORD )(offset & 0xFFFFFFFF );
1563
1561
/* For files, it would be sufficient to pass 0 as size.
1564
1562
For anonymous maps, we have to pass the size explicitly. */
1565
- m_obj -> map_handle = CreateFileMappingA (m_obj -> file_handle ,
1563
+ m_obj -> map_handle = CreateFileMappingW (m_obj -> file_handle ,
1566
1564
NULL ,
1567
1565
flProtect ,
1568
1566
size_hi ,
@@ -1771,5 +1769,3 @@ PyInit_mmap(void)
1771
1769
{
1772
1770
return PyModuleDef_Init (& mmapmodule );
1773
1771
}
1774
-
1775
- #endif /* !MS_WINDOWS || MS_WINDOWS_DESKTOP || MS_WINDOWS_GAMES */
0 commit comments