Commit aecea3d9 authored by Benjamin Peterson's avatar Benjamin Peterson

merge 3.2 (closes #23165)

parents 615249dd 8eca47ea
...@@ -23,6 +23,9 @@ Core and Builtins ...@@ -23,6 +23,9 @@ Core and Builtins
- Issue #22518: Fix integer overflow issues in latin-1 encoding. - Issue #22518: Fix integer overflow issues in latin-1 encoding.
- Issue #23165: Perform overflow checks before allocating memory in the
_Py_char2wchar function.
Library Library
------- -------
......
...@@ -201,8 +201,11 @@ decode_ascii_surrogateescape(const char *arg, size_t *size) ...@@ -201,8 +201,11 @@ decode_ascii_surrogateescape(const char *arg, size_t *size)
wchar_t *res; wchar_t *res;
unsigned char *in; unsigned char *in;
wchar_t *out; wchar_t *out;
size_t argsize = strlen(arg) + 1;
res = PyMem_Malloc((strlen(arg)+1)*sizeof(wchar_t)); if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
return NULL;
res = PyMem_Malloc(argsize*sizeof(wchar_t));
if (!res) if (!res)
return NULL; return NULL;
...@@ -284,10 +287,15 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -284,10 +287,15 @@ _Py_char2wchar(const char* arg, size_t *size)
argsize = mbstowcs(NULL, arg, 0); argsize = mbstowcs(NULL, arg, 0);
#endif #endif
if (argsize != (size_t)-1) { if (argsize != (size_t)-1) {
res = (wchar_t *)PyMem_Malloc((argsize+1)*sizeof(wchar_t)); if (argsize == PY_SSIZE_T_MAX)
goto oom;
argsize += 1;
if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
goto oom;
res = (wchar_t *)PyMem_Malloc(argsize*sizeof(wchar_t));
if (!res) if (!res)
goto oom; goto oom;
count = mbstowcs(res, arg, argsize+1); count = mbstowcs(res, arg, argsize);
if (count != (size_t)-1) { if (count != (size_t)-1) {
wchar_t *tmp; wchar_t *tmp;
/* Only use the result if it contains no /* Only use the result if it contains no
...@@ -310,6 +318,8 @@ _Py_char2wchar(const char* arg, size_t *size) ...@@ -310,6 +318,8 @@ _Py_char2wchar(const char* arg, size_t *size)
/* Overallocate; as multi-byte characters are in the argument, the /* Overallocate; as multi-byte characters are in the argument, the
actual output could use less memory. */ actual output could use less memory. */
argsize = strlen(arg) + 1; argsize = strlen(arg) + 1;
if (argsize > PY_SSIZE_T_MAX/sizeof(wchar_t))
goto oom;
res = (wchar_t*)PyMem_Malloc(argsize*sizeof(wchar_t)); res = (wchar_t*)PyMem_Malloc(argsize*sizeof(wchar_t));
if (!res) if (!res)
goto oom; goto oom;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment