From a074af0a88905c7c6600870c3774118511c179d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:37:35 +0200 Subject: [PATCH] avoid NULL + 0 arithmetic in `list_extend_*` functions --- Objects/listobject.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Objects/listobject.c b/Objects/listobject.c index 2ac4ce095fcadd..7648c1dfe9f0a8 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -1315,9 +1315,15 @@ list_extend_set(PyListObject *self, PySetObject *other) { Py_ssize_t m = Py_SIZE(self); Py_ssize_t n = PySet_GET_SIZE(other); - if (list_resize(self, m + n) < 0) { + Py_ssize_t r = m + n; + if (r == 0) { + return 0; + } + if (list_resize(self, r) < 0) { return -1; } + + assert(self->ob_item != NULL); /* populate the end of self with iterable's items */ Py_ssize_t setpos = 0; Py_hash_t hash; @@ -1327,7 +1333,7 @@ list_extend_set(PyListObject *self, PySetObject *other) FT_ATOMIC_STORE_PTR_RELEASE(*dest, key); dest++; } - Py_SET_SIZE(self, m + n); + Py_SET_SIZE(self, r); return 0; } @@ -1337,10 +1343,15 @@ list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item) // which_item: 0 for keys and 1 for values Py_ssize_t m = Py_SIZE(self); Py_ssize_t n = PyDict_GET_SIZE(dict); - if (list_resize(self, m + n) < 0) { + Py_ssize_t r = m + n; + if (r == 0) { + return 0; + } + if (list_resize(self, r) < 0) { return -1; } + assert(self->ob_item != NULL); PyObject **dest = self->ob_item + m; Py_ssize_t pos = 0; PyObject *keyvalue[2]; @@ -1351,7 +1362,7 @@ list_extend_dict(PyListObject *self, PyDictObject *dict, int which_item) dest++; } - Py_SET_SIZE(self, m + n); + Py_SET_SIZE(self, r); return 0; } @@ -1360,10 +1371,15 @@ list_extend_dictitems(PyListObject *self, PyDictObject *dict) { Py_ssize_t m = Py_SIZE(self); Py_ssize_t n = PyDict_GET_SIZE(dict); - if (list_resize(self, m + n) < 0) { + Py_ssize_t r = m + n; + if (r == 0) { + return 0; + } + if (list_resize(self, r) < 0) { return -1; } + assert(self->ob_item != NULL); PyObject **dest = self->ob_item + m; Py_ssize_t pos = 0; Py_ssize_t i = 0; @@ -1379,7 +1395,7 @@ list_extend_dictitems(PyListObject *self, PyDictObject *dict) i++; } - Py_SET_SIZE(self, m + n); + Py_SET_SIZE(self, r); return 0; }