diff --git a/Objects/listobject.c b/Objects/listobject.c index fa26444f847fc4..f074968c4c9bf8 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1358,9 +1358,11 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ while (ofs < maxofs) { IFLT(a[ofs], key) { lastofs = ofs; - ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ + if (ofs <= (PY_SSIZE_T_MAX - 1) >> 1) { + ofs = (ofs << 1) + 1; + } else { ofs = maxofs; + } } else /* key <= a[hint + ofs] */ break; @@ -1381,9 +1383,11 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_ break; /* key <= a[hint - ofs] */ lastofs = ofs; - ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ + if (ofs <= (PY_SSIZE_T_MAX - 1) >> 1) { + ofs = (ofs << 1) + 1; + } else { ofs = maxofs; + } } if (ofs > maxofs) ofs = maxofs; @@ -1449,9 +1453,11 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize while (ofs < maxofs) { IFLT(key, *(a-ofs)) { lastofs = ofs; - ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ + if (ofs <= (PY_SSIZE_T_MAX - 1) >> 1) { + ofs = (ofs << 1) + 1; + } else { ofs = maxofs; + } } else /* a[hint - ofs] <= key */ break; @@ -1473,9 +1479,11 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize break; /* a[hint + ofs] <= key */ lastofs = ofs; - ofs = (ofs << 1) + 1; - if (ofs <= 0) /* int overflow */ + if (ofs <= (PY_SSIZE_T_MAX - 1) >> 1) { + ofs = (ofs << 1) + 1; + } else { ofs = maxofs; + } } if (ofs > maxofs) ofs = maxofs;