bpo-44707: Fix an undefined behavior of the null pointer arithmetic (GH-27292)

This commit is contained in:
Serhiy Storchaka 2021-07-29 14:36:24 +03:00 committed by GitHub
parent ce5e1a6809
commit e5c8ddb171
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -180,9 +180,10 @@ PyList_New(Py_ssize_t size)
static PyObject * static PyObject *
list_new_prealloc(Py_ssize_t size) list_new_prealloc(Py_ssize_t size)
{ {
assert(size > 0);
PyListObject *op = (PyListObject *) PyList_New(0); PyListObject *op = (PyListObject *) PyList_New(0);
if (size == 0 || op == NULL) { if (op == NULL) {
return (PyObject *) op; return NULL;
} }
assert(op->ob_item == NULL); assert(op->ob_item == NULL);
op->ob_item = PyMem_New(PyObject *, size); 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; PyObject **src, **dest;
Py_ssize_t i, len; Py_ssize_t i, len;
len = ihigh - ilow; len = ihigh - ilow;
if (len <= 0) {
return PyList_New(0);
}
np = (PyListObject *) list_new_prealloc(len); np = (PyListObject *) list_new_prealloc(len);
if (np == NULL) if (np == NULL)
return NULL; return NULL;
@ -512,6 +516,9 @@ list_concat(PyListObject *a, PyObject *bb)
#define b ((PyListObject *)bb) #define b ((PyListObject *)bb)
assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX); assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
size = Py_SIZE(a) + Py_SIZE(b); size = Py_SIZE(a) + Py_SIZE(b);
if (size == 0) {
return PyList_New(0);
}
np = (PyListObject *) list_new_prealloc(size); np = (PyListObject *) list_new_prealloc(size);
if (np == NULL) { if (np == NULL) {
return NULL; return NULL;