diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2021-07-29 11:36:24 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-29 11:36:24 (GMT) |
commit | e5c8ddb1714fb51ab1defa24352c98e0f01205dc (patch) | |
tree | e5204f644e0019a5a32f24081c343426df1ba485 /Objects/listobject.c | |
parent | ce5e1a6809b714eb0383219190a076d9f883e008 (diff) | |
download | cpython-e5c8ddb1714fb51ab1defa24352c98e0f01205dc.zip cpython-e5c8ddb1714fb51ab1defa24352c98e0f01205dc.tar.gz cpython-e5c8ddb1714fb51ab1defa24352c98e0f01205dc.tar.bz2 |
bpo-44707: Fix an undefined behavior of the null pointer arithmetic (GH-27292)
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r-- | Objects/listobject.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c index 6eb7dce..898cbc2 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -180,9 +180,10 @@ PyList_New(Py_ssize_t size) static PyObject * list_new_prealloc(Py_ssize_t size) { + assert(size > 0); PyListObject *op = (PyListObject *) PyList_New(0); - if (size == 0 || op == NULL) { - return (PyObject *) op; + if (op == NULL) { + return NULL; } assert(op->ob_item == NULL); op->ob_item = PyMem_New(PyObject *, size); @@ -459,6 +460,9 @@ list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) PyObject **src, **dest; Py_ssize_t i, len; len = ihigh - ilow; + if (len <= 0) { + return PyList_New(0); + } np = (PyListObject *) list_new_prealloc(len); if (np == NULL) return NULL; @@ -512,6 +516,9 @@ list_concat(PyListObject *a, PyObject *bb) #define b ((PyListObject *)bb) assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX); size = Py_SIZE(a) + Py_SIZE(b); + if (size == 0) { + return PyList_New(0); + } np = (PyListObject *) list_new_prealloc(size); if (np == NULL) { return NULL; |