You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Ensure that the result of PyUnicode_AsWideCharString() doesn't contain null characters if size is not returned #74893
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2017-06-27.19:06:14.376>created_at=<Date2017-06-20.04:38:10.522>labels= ['interpreter-core', 'type-feature', '3.7', 'expert-unicode']
title="Ensure that the result of PyUnicode_AsWideCharString() doesn't contain null characters if size is not returned"updated_at=<Date2017-06-27.19:06:14.374>user='https://github.com/serhiy-storchaka'
is a pointer to Py_ssize_t. The size of created wchar_t array is saved on this pointer if it is not NULL. If NULL is passed as the second argument, the only way to determine the size of the wchar_t string is using wcslen(). But if the string contains the null characters, it looks truncated for wcslen() and other C API functions.
Reliable code should always pass the non-NULL second argument and check that wcslen() is equal to the returned string size. See for example the code in Modules/_io/winconsoleio.c. Passing NULL as the second argument is unsafe. But most code doesn't do such check (see all other usages of PyUnicode_AsWideCharString(..., NULL)). And this check complicates the callers code.
I propose to make the check for null characters inside of PyUnicode_AsWideCharString() if NULL is passes as the second argument. This will fix all unsafe usages of PyUnicode_AsWideCharString() and allow to simplify the reliable code.
This change needs changing one ctypes test, and can break third-party tests or even a code. That is why it is targeted only for 3.7. I'm going to backport the change as a private function for using in CPython internally since this can fix vulnerabilities.
Could anyone please make a review of this PR? Especially the documentation part. This PR is a part of a set of PRs that fix potential vulnerabilities (bpo-13617, bpo-30730, and yet few issues planned).
New changeset 0edffa3 by Serhiy Storchaka in branch '3.6':
[3.6] bpo-30708: Check for null characters in PyUnicode_AsWideCharString(). (GH-2285) (bpo-2443) 0edffa3
Activity
serhiy-storchaka commentedon Jun 20, 2017
The second parameter of the PyUnicode_AsWideCharString() function
is a pointer to Py_ssize_t. The size of created wchar_t array is saved on this pointer if it is not NULL. If NULL is passed as the second argument, the only way to determine the size of the wchar_t string is using wcslen(). But if the string contains the null characters, it looks truncated for wcslen() and other C API functions.
Reliable code should always pass the non-NULL second argument and check that wcslen() is equal to the returned string size. See for example the code in Modules/_io/winconsoleio.c. Passing NULL as the second argument is unsafe. But most code doesn't do such check (see all other usages of PyUnicode_AsWideCharString(..., NULL)). And this check complicates the callers code.
I propose to make the check for null characters inside of PyUnicode_AsWideCharString() if NULL is passes as the second argument. This will fix all unsafe usages of PyUnicode_AsWideCharString() and allow to simplify the reliable code.
This issue fixes the part of bpo-13617.
serhiy-storchaka commentedon Jun 21, 2017
This change needs changing one ctypes test, and can break third-party tests or even a code. That is why it is targeted only for 3.7. I'm going to backport the change as a private function for using in CPython internally since this can fix vulnerabilities.
serhiy-storchaka commentedon Jun 24, 2017
Could anyone please make a review of this PR? Especially the documentation part. This PR is a part of a set of PRs that fix potential vulnerabilities (bpo-13617, bpo-30730, and yet few issues planned).
serhiy-storchaka commentedon Jun 27, 2017
New changeset e613e6a by Serhiy Storchaka in branch 'master':
bpo-30708: Check for null characters in PyUnicode_AsWideCharString(). (bpo-2285)
e613e6a
serhiy-storchaka commentedon Jun 27, 2017
New changeset 0edffa3 by Serhiy Storchaka in branch '3.6':
[3.6] bpo-30708: Check for null characters in PyUnicode_AsWideCharString(). (GH-2285) (bpo-2443)
0edffa3
serhiy-storchaka commentedon Jun 27, 2017
New changeset 94b169f by Serhiy Storchaka in branch '3.5':
[3.5] bpo-30708: Add private C API function _PyUnicode_AsWideCharString(). (GH-2285) (GH-2443) (bpo-2448)
94b169f
serhiy-storchaka commentedon Jun 27, 2017
Wrong commit message in 3.6. Should be the same as in 3.5.
This functionality was backported as a private function _PyUnicode_AsWideCharString().