]> granicus.if.org Git - python/commitdiff
Issue #12973: Fix undefined-behaviour-inducing overflow check in list_repeat.
authorMark Dickinson <mdickinson@enthought.com>
Mon, 19 Sep 2011 18:18:37 +0000 (19:18 +0100)
committerMark Dickinson <mdickinson@enthought.com>
Mon, 19 Sep 2011 18:18:37 +0000 (19:18 +0100)
Misc/NEWS
Objects/listobject.c

index bfe536925aa2d93f29b41ed6bb4e002bf455c724..bc52aa8ae983e6ad6e60e3937f921cc393bb02de 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ What's New in Python 3.2.3?
 Core and Builtins
 -----------------
 
+- Issue #12973: Fix overflow check that relied on undefined behaviour in
+  list_repeat.  This bug caused test_list to fail with recent versions
+  of Clang.
+
 - Issue #12802: the Windows error ERROR_DIRECTORY (numbered 267) is now
   mapped to POSIX errno ENOTDIR (previously EINVAL).
 
index 73624f0b7409632571c95b3f045682635fcee913..36f8b9dc70b9cdd0e2277440317bb67398d168d5 100644 (file)
@@ -58,7 +58,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize)
     if (newsize == 0)
         new_allocated = 0;
     items = self->ob_item;
-    if (new_allocated <= ((~(size_t)0) / sizeof(PyObject *)))
+    if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
         PyMem_RESIZE(items, PyObject *, new_allocated);
     else
         items = NULL;
@@ -510,9 +510,9 @@ list_repeat(PyListObject *a, Py_ssize_t n)
     PyObject *elem;
     if (n < 0)
         n = 0;
-    size = Py_SIZE(a) * n;
-    if (n && size/n != Py_SIZE(a))
+    if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
         return PyErr_NoMemory();
+    size = Py_SIZE(a) * n;
     if (size == 0)
         return PyList_New(0);
     np = (PyListObject *) PyList_New(size);