@@ -1535,13 +1535,19 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
1535
1535
if (!locale_ ) {
1536
1536
return NULL ;
1537
1537
}
1538
- wchar_t * src_ = PyUnicode_AsWideCharString (src , NULL );
1538
+ Py_ssize_t srcLenAsSsize ;
1539
+ int srcLen ;
1540
+ wchar_t * src_ = PyUnicode_AsWideCharString (src , & srcLenAsSsize );
1539
1541
if (!src_ ) {
1540
1542
PyMem_Free (locale_ );
1541
1543
return NULL ;
1542
1544
}
1545
+ srcLen = (int )srcLenAsSsize ;
1546
+ if (srcLen != srcLenAsSsize ) {
1547
+ srcLen = -1 ;
1548
+ }
1543
1549
1544
- int dest_size = LCMapStringEx (locale_ , flags , src_ , -1 , NULL , 0 ,
1550
+ int dest_size = LCMapStringEx (locale_ , flags , src_ , srcLen , NULL , 0 ,
1545
1551
NULL , NULL , 0 );
1546
1552
if (dest_size == 0 ) {
1547
1553
PyMem_Free (locale_ );
@@ -1556,7 +1562,7 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
1556
1562
return PyErr_NoMemory ();
1557
1563
}
1558
1564
1559
- int nmapped = LCMapStringEx (locale_ , flags , src_ , -1 , dest , dest_size ,
1565
+ int nmapped = LCMapStringEx (locale_ , flags , src_ , srcLen , dest , dest_size ,
1560
1566
NULL , NULL , 0 );
1561
1567
if (nmapped == 0 ) {
1562
1568
DWORD error = GetLastError ();
@@ -1566,7 +1572,7 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
1566
1572
return PyErr_SetFromWindowsErr (error );
1567
1573
}
1568
1574
1569
- PyObject * ret = PyUnicode_FromWideChar (dest , dest_size - 1 );
1575
+ PyObject * ret = PyUnicode_FromWideChar (dest , dest_size );
1570
1576
PyMem_Free (locale_ );
1571
1577
PyMem_Free (src_ );
1572
1578
PyMem_DEL (dest );
0 commit comments