| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent a39f0a3 commit 04cc014
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1036,6 +1036,7 @@ def test_path_normcase(self): | |||
| 1036 | 1036 | self._check_function(self.path.normcase) | |
| 1037 | 1037 | if sys.platform == 'win32': | |
| 1038 | 1038 | self.assertEqual(ntpath.normcase('\u03a9\u2126'), 'ωΩ') | |
| 1039 | + self.assertEqual(ntpath.normcase('abc\x00def'), 'abc\x00def') | ||
| 1039 | 1040 | ||
| 1040 | 1041 | def test_path_isabs(self): | |
| 1041 | 1042 | self._check_function(self.path.isabs) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1 @@ | |||
| 1 | + Fix integer overflow and truncating by the null character in :func:`!_winapi.LCMapStringEx` which affects :func:`ntpath.normcase`. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1539,40 +1539,56 @@ _winapi.LCMapStringEx | |||
| 1539 | 1539 | ||
| 1540 | 1540 | locale: LPCWSTR | |
| 1541 | 1541 | flags: DWORD | |
| 1542 | - src: LPCWSTR | ||
| 1542 | + src: unicode | ||
| 1543 | 1543 | ||
| 1544 | 1544 | [clinic start generated code]*/ | |
| 1545 | 1545 | ||
| 1546 | 1546 | static PyObject * | |
| 1547 | 1547 | _winapi_LCMapStringEx_impl(PyObject *module, LPCWSTR locale, DWORD flags, | |
| 1548 | - LPCWSTR src) | ||
| 1549 | - /*[clinic end generated code: output=cf4713d80e2b47c9 input=9fe26f95d5ab0001]*/ | ||
| 1548 | + PyObject *src) | ||
| 1549 | + /*[clinic end generated code: output=b90e6b26e028ff0a input=3e3dcd9b8164012f]*/ | ||
| 1550 | 1550 | { | |
| 1551 | 1551 | if (flags & (LCMAP_SORTHANDLE | LCMAP_HASH | LCMAP_BYTEREV | | |
| 1552 | 1552 | LCMAP_SORTKEY)) { | |
| 1553 | 1553 | return PyErr_Format(PyExc_ValueError, "unsupported flags"); | |
| 1554 | 1554 | } | |
| 1555 | 1555 | ||
| 1556 | - int dest_size = LCMapStringEx(locale, flags, src, -1, NULL, 0, | ||
| 1556 | + Py_ssize_t src_size; | ||
| 1557 | + wchar_t *src_ = PyUnicode_AsWideCharString(src, &src_size); | ||
| 1558 | + if (!src_) { | ||
| 1559 | + return NULL; | ||
| 1560 | + } | ||
| 1561 | + if (src_size > INT_MAX) { | ||
| 1562 | + PyMem_Free(src_); | ||
| 1563 | + PyErr_SetString(PyExc_OverflowError, "input string is too long"); | ||
| 1564 | + return NULL; | ||
| 1565 | + } | ||
| 1566 | + | ||
| 1567 | + int dest_size = LCMapStringEx(locale, flags, src_, (int)src_size, NULL, 0, | ||
| 1557 | 1568 | NULL, NULL, 0); | |
| 1558 | - if (dest_size == 0) { | ||
| 1559 | - return PyErr_SetFromWindowsErr(0); | ||
| 1569 | + if (dest_size <= 0) { | ||
| 1570 | + DWORD error = GetLastError(); | ||
| 1571 | + PyMem_Free(src_); | ||
| 1572 | + return PyErr_SetFromWindowsErr(error); | ||
| 1560 | 1573 | } | |
| 1561 | 1574 | ||
| 1562 | 1575 | wchar_t* dest = PyMem_NEW(wchar_t, dest_size); | |
| 1563 | 1576 | if (dest == NULL) { | |
| 1577 | + PyMem_Free(src_); | ||
| 1564 | 1578 | return PyErr_NoMemory(); | |
| 1565 | 1579 | } | |
| 1566 | 1580 | ||
| 1567 | - int nmapped = LCMapStringEx(locale, flags, src, -1, dest, dest_size, | ||
| 1581 | + int nmapped = LCMapStringEx(locale, flags, src_, (int)src_size, dest, dest_size, | ||
| 1568 | 1582 | NULL, NULL, 0); | |
| 1569 | - if (nmapped == 0) { | ||
| 1583 | + if (nmapped <= 0) { | ||
| 1570 | 1584 | DWORD error = GetLastError(); | |
| 1585 | + PyMem_Free(src_); | ||
| 1571 | 1586 | PyMem_DEL(dest); | |
| 1572 | 1587 | return PyErr_SetFromWindowsErr(error); | |
| 1573 | 1588 | } | |
| 1574 | 1589 | ||
| 1575 | - PyObject *ret = PyUnicode_FromWideChar(dest, dest_size - 1); | ||
| 1590 | + PyMem_Free(src_); | ||
| 1591 | + PyObject *ret = PyUnicode_FromWideChar(dest, nmapped); | ||
| 1576 | 1592 | PyMem_DEL(dest); | |
| 1577 | 1593 | ||
| 1578 | 1594 | return ret; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments