]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42658: Allow _winapi.LCMapStringEx to handle embedded nulls (GH-93688)
authorSteve Dower <steve.dower@python.org>
Fri, 10 Jun 2022 16:09:37 +0000 (17:09 +0100)
committerGitHub <noreply@github.com>
Fri, 10 Jun 2022 16:09:37 +0000 (17:09 +0100)
Modules/_winapi.c

index a3c30f23955450fd263fcb79466b1a585ca85f6f..9b30a900326192751b0786c571b1921b06f4440a 100644 (file)
@@ -1535,13 +1535,19 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
     if (!locale_) {
         return NULL;
     }
-    wchar_t *src_ = PyUnicode_AsWideCharString(src, NULL);
+    Py_ssize_t srcLenAsSsize;
+    int srcLen;
+    wchar_t *src_ = PyUnicode_AsWideCharString(src, &srcLenAsSsize);
     if (!src_) {
         PyMem_Free(locale_);
         return NULL;
     }
+    srcLen = (int)srcLenAsSsize;
+    if (srcLen != srcLenAsSsize) {
+        srcLen = -1;
+    }
 
-    int dest_size = LCMapStringEx(locale_, flags, src_, -1, NULL, 0,
+    int dest_size = LCMapStringEx(locale_, flags, src_, srcLen, NULL, 0,
                                   NULL, NULL, 0);
     if (dest_size == 0) {
         PyMem_Free(locale_);
@@ -1556,7 +1562,7 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
         return PyErr_NoMemory();
     }
 
-    int nmapped = LCMapStringEx(locale_, flags, src_, -1, dest, dest_size,
+    int nmapped = LCMapStringEx(locale_, flags, src_, srcLen, dest, dest_size,
                                 NULL, NULL, 0);
     if (nmapped == 0) {
         DWORD error = GetLastError();
@@ -1566,7 +1572,7 @@ _winapi_LCMapStringEx_impl(PyObject *module, PyObject *locale, DWORD flags,
         return PyErr_SetFromWindowsErr(error);
     }
 
-    PyObject *ret = PyUnicode_FromWideChar(dest, dest_size - 1);
+    PyObject *ret = PyUnicode_FromWideChar(dest, dest_size);
     PyMem_Free(locale_);
     PyMem_Free(src_);
     PyMem_DEL(dest);