mirror of
https://github.com/python/cpython.git
synced 2025-07-24 19:54:21 +00:00
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].
This commit is contained in:
parent
af5ac3974b
commit
e6fc7401a9
2 changed files with 13 additions and 1 deletions
|
@ -131,7 +131,8 @@ PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
|
|||
|
||||
int
|
||||
PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
|
||||
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
|
||||
Py_ssize_t *slicelength)
|
||||
{
|
||||
/* this is harder to get right than you might think */
|
||||
|
||||
|
@ -147,6 +148,13 @@ PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
|
|||
"slice step cannot be zero");
|
||||
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;
|
||||
}
|
||||
|
||||
defstart = *step < 0 ? length-1 : 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue