[Python-checkins] bpo-35091: Objects/listobject.c: Replace overflow checks in gallop fu… (GH-10202)
Miss Islington (bot)
webhook-mailer at python.org
Wed May 22 20:01:12 EDT 2019
https://github.com/python/cpython/commit/6bc5917903b722bdd0e5d3020949f26fec5dfe9a
commit: 6bc5917903b722bdd0e5d3020949f26fec5dfe9a
branch: master
author: Alexey Izbyshev <izbyshev at ispras.ru>
committer: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
date: 2019-05-22T17:01:08-07:00
summary:
bpo-35091: Objects/listobject.c: Replace overflow checks in gallop fu… (GH-10202)
…nctions with asserts
The actual overflow can never happen because of the following:
* The size of a list can't be greater than PY_SSIZE_T_MAX / sizeof(PyObject*).
* The size of a pointer on all supported plaftorms is at least 4 bytes.
* ofs is positive and less than the list size at the beginning of each iteration.
https://bugs.python.org/issue35091
files:
M Objects/listobject.c
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 08b3e89a957f..3185957453d7 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1380,9 +1380,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_
while (ofs < maxofs) {
IFLT(a[ofs], key) {
lastofs = ofs;
+ assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
ofs = (ofs << 1) + 1;
- if (ofs <= 0) /* int overflow */
- ofs = maxofs;
}
else /* key <= a[hint + ofs] */
break;
@@ -1403,9 +1402,8 @@ gallop_left(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_
break;
/* key <= a[hint - ofs] */
lastofs = ofs;
+ assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
ofs = (ofs << 1) + 1;
- if (ofs <= 0) /* int overflow */
- ofs = maxofs;
}
if (ofs > maxofs)
ofs = maxofs;
@@ -1471,9 +1469,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize
while (ofs < maxofs) {
IFLT(key, *(a-ofs)) {
lastofs = ofs;
+ assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
ofs = (ofs << 1) + 1;
- if (ofs <= 0) /* int overflow */
- ofs = maxofs;
}
else /* a[hint - ofs] <= key */
break;
@@ -1495,9 +1492,8 @@ gallop_right(MergeState *ms, PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize
break;
/* a[hint + ofs] <= key */
lastofs = ofs;
+ assert(ofs <= (PY_SSIZE_T_MAX - 1) / 2);
ofs = (ofs << 1) + 1;
- if (ofs <= 0) /* int overflow */
- ofs = maxofs;
}
if (ofs > maxofs)
ofs = maxofs;
More information about the Python-checkins
mailing list