29
29
#include "structmember.h" // PyMemberDef
30
30
#include <stddef.h> // offsetof()
31
31
32
- // to support MS_WINDOWS_SYSTEM OpenFileMappingA / CreateFileMappingA
33
- // need to be replaced with OpenFileMappingW / CreateFileMappingW
34
- #if !defined(MS_WINDOWS ) || defined(MS_WINDOWS_DESKTOP ) || defined(MS_WINDOWS_GAMES )
35
-
36
32
#ifndef MS_WINDOWS
37
33
#define UNIX
38
34
# ifdef HAVE_FCNTL_H
@@ -113,7 +109,7 @@ typedef struct {
113
109
#ifdef MS_WINDOWS
114
110
HANDLE map_handle ;
115
111
HANDLE file_handle ;
116
- char * tagname ;
112
+ wchar_t * tagname ;
117
113
#endif
118
114
119
115
#ifdef UNIX
@@ -531,7 +527,7 @@ mmap_resize_method(mmap_object *self,
531
527
CloseHandle (self -> map_handle );
532
528
/* if the file mapping still exists, it cannot be resized. */
533
529
if (self -> tagname ) {
534
- self -> map_handle = OpenFileMappingA (FILE_MAP_WRITE , FALSE,
530
+ self -> map_handle = OpenFileMappingW (FILE_MAP_WRITE , FALSE,
535
531
self -> tagname );
536
532
if (self -> map_handle ) {
537
533
PyErr_SetFromWindowsErr (ERROR_USER_MAPPED_FILE );
@@ -560,7 +556,7 @@ mmap_resize_method(mmap_object *self,
560
556
561
557
/* create a new file mapping and map a new view */
562
558
/* FIXME: call CreateFileMappingW with wchar_t tagname */
563
- self -> map_handle = CreateFileMappingA (
559
+ self -> map_handle = CreateFileMappingW (
564
560
self -> file_handle ,
565
561
NULL ,
566
562
PAGE_READWRITE ,
@@ -836,7 +832,7 @@ mmap__sizeof__method(mmap_object *self, void *unused)
836
832
{
837
833
size_t res = _PyObject_SIZE (Py_TYPE (self ));
838
834
if (self -> tagname ) {
839
- res += strlen ( self -> tagname ) + 1 ;
835
+ res += ( wcslen ( self -> tagname ) + 1 ) * sizeof ( self -> tagname [ 0 ]) ;
840
836
}
841
837
return PyLong_FromSize_t (res );
842
838
}
@@ -1390,7 +1386,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1390
1386
DWORD off_lo ; /* lower 32 bits of offset */
1391
1387
DWORD size_hi ; /* upper 32 bits of size */
1392
1388
DWORD size_lo ; /* lower 32 bits of size */
1393
- const char * tagname = "" ;
1389
+ PyObject * tagname = Py_None ;
1394
1390
DWORD dwErr = 0 ;
1395
1391
int fileno ;
1396
1392
HANDLE fh = 0 ;
@@ -1400,7 +1396,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1400
1396
"tagname" ,
1401
1397
"access" , "offset" , NULL };
1402
1398
1403
- if (!PyArg_ParseTupleAndKeywords (args , kwdict , "in|ziL " , keywords ,
1399
+ if (!PyArg_ParseTupleAndKeywords (args , kwdict , "in|OiL " , keywords ,
1404
1400
& fileno , & map_size ,
1405
1401
& tagname , & access , & offset )) {
1406
1402
return NULL ;
@@ -1533,17 +1529,19 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1533
1529
m_obj -> weakreflist = NULL ;
1534
1530
m_obj -> exports = 0 ;
1535
1531
/* set the tag name */
1536
- if (tagname != NULL && * tagname != '\0' ) {
1537
- m_obj -> tagname = PyMem_Malloc (strlen (tagname )+ 1 );
1532
+ if (!Py_IsNone (tagname )) {
1533
+ if (!PyUnicode_Check (tagname )) {
1534
+ Py_DECREF (m_obj );
1535
+ return PyErr_Format (PyExc_TypeError , "expected str or None for "
1536
+ "'tagname', not %.200s" ,
1537
+ Py_TYPE (tagname )-> tp_name );
1538
+ }
1539
+ m_obj -> tagname = PyUnicode_AsWideCharString (tagname , NULL );
1538
1540
if (m_obj -> tagname == NULL ) {
1539
- PyErr_NoMemory ();
1540
1541
Py_DECREF (m_obj );
1541
1542
return NULL ;
1542
1543
}
1543
- strcpy (m_obj -> tagname , tagname );
1544
1544
}
1545
- else
1546
- m_obj -> tagname = NULL ;
1547
1545
1548
1546
m_obj -> access = (access_mode )access ;
1549
1547
size_hi = (DWORD )(size >> 32 );
@@ -1552,7 +1550,7 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
1552
1550
off_lo = (DWORD )(offset & 0xFFFFFFFF );
1553
1551
/* For files, it would be sufficient to pass 0 as size.
1554
1552
For anonymous maps, we have to pass the size explicitly. */
1555
- m_obj -> map_handle = CreateFileMappingA (m_obj -> file_handle ,
1553
+ m_obj -> map_handle = CreateFileMappingW (m_obj -> file_handle ,
1556
1554
NULL ,
1557
1555
flProtect ,
1558
1556
size_hi ,
@@ -1763,5 +1761,3 @@ PyInit_mmap(void)
1763
1761
{
1764
1762
return PyModuleDef_Init (& mmapmodule );
1765
1763
}
1766
-
1767
- #endif /* !MS_WINDOWS || MS_WINDOWS_DESKTOP || MS_WINDOWS_GAMES */
0 commit comments