Kaydet (Commit) 2a0438d2 authored tarafından Martin Panter's avatar Martin Panter

Issue #27581: Don’t rely on overflow wrapping in PySequence_Tuple()

Patch by Xiang Zhang.
üst 1e411c5c
...@@ -16,6 +16,9 @@ Core and Builtins ...@@ -16,6 +16,9 @@ Core and Builtins
- Issue #27507: Add integer overflow check in bytearray.extend(). Patch by - Issue #27507: Add integer overflow check in bytearray.extend(). Patch by
Xiang Zhang. Xiang Zhang.
- Issue #27581: Don't rely on wrapping for overflow check in
PySequence_Tuple(). Patch by Xiang Zhang.
- Issue #23908: os functions, open() and the io.FileIO constructor now reject - Issue #23908: os functions, open() and the io.FileIO constructor now reject
unicode paths with embedded null character on Windows instead of silently unicode paths with embedded null character on Windows instead of silently
truncating them. truncating them.
......
...@@ -2211,21 +2211,22 @@ PySequence_Tuple(PyObject *v) ...@@ -2211,21 +2211,22 @@ PySequence_Tuple(PyObject *v)
break; break;
} }
if (j >= n) { if (j >= n) {
Py_ssize_t oldn = n; size_t newn = (size_t)n;
/* The over-allocation strategy can grow a bit faster /* The over-allocation strategy can grow a bit faster
than for lists because unlike lists the than for lists because unlike lists the
over-allocation isn't permanent -- we reclaim over-allocation isn't permanent -- we reclaim
the excess before the end of this routine. the excess before the end of this routine.
So, grow by ten and then add 25%. So, grow by ten and then add 25%.
*/ */
n += 10; newn += 10u;
n += n >> 2; newn += newn >> 2;
if (n < oldn) { if (newn > PY_SSIZE_T_MAX) {
/* Check for overflow */ /* Check for overflow */
PyErr_NoMemory(); PyErr_NoMemory();
Py_DECREF(item); Py_DECREF(item);
goto Fail; goto Fail;
} }
n = (Py_ssize_t)newn;
if (_PyTuple_Resize(&result, n) != 0) { if (_PyTuple_Resize(&result, n) != 0) {
Py_DECREF(item); Py_DECREF(item);
goto Fail; goto Fail;
......
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