Kaydet (Commit) f6a31339 authored tarafından Victor Stinner's avatar Victor Stinner Kaydeden (comit) GitHub

bpo-30255: Clip step in _PySlice_Unpack() (#1429)

In PySlice_IndicesEx, clip the step to [-PY_SSIZE_T_MAX,
PY_SSIZE_T_MAX] rather than [PY_SSIZE_T_MIN, PY_SSIZE_T_MAX].

(cherry picked from commit e6fc7401)
üst 0d493795
...@@ -932,6 +932,11 @@ Tools/Demos ...@@ -932,6 +932,11 @@ Tools/Demos
C API C API
----- -----
- bpo-30255: PySlice_GetIndicesEx now clips the step to
[-PY_SSIZE_T_MAX, PY_SSIZE_T_MAX] instead of
[-PY_SSIZE_T_MAX-1, PY_SSIZE_T_MAX]. This makes it safe to do "step = -step"
when reversing a slice.
- Issue #26476: Fixed compilation error when use PyErr_BadInternalCall() in C++. - Issue #26476: Fixed compilation error when use PyErr_BadInternalCall() in C++.
Patch by Jeroen Demeyer. Patch by Jeroen Demeyer.
......
...@@ -147,6 +147,13 @@ _PySlice_Unpack(PyObject *_r, ...@@ -147,6 +147,13 @@ _PySlice_Unpack(PyObject *_r,
"slice step cannot be zero"); "slice step cannot be zero");
return -1; return -1;
} }
/* Here *step might be -PY_SSIZE_T_MAX-1; in this case we replace it
* with -PY_SSIZE_T_MAX. This doesn't affect the semantics, and it
* guards against later undefined behaviour resulting from code that
* does "step = -step" as part of a slice reversal.
*/
if (*step < -PY_SSIZE_T_MAX)
*step = -PY_SSIZE_T_MAX;
} }
if (r->start == Py_None) { if (r->start == Py_None) {
......
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