https://github.com/python/cpython/commit/a99bfaa53cbbb2ebd35bd94237a11bfaefe32665
commit: a99bfaa53cbbb2ebd35bd94237a11bfaefe32665
branch: main
author: Bénédikt Tran <[email protected]>
committer: picnixz <[email protected]>
date: 2025-04-28T15:59:09+02:00
summary:
gh-133073: avoid `NULL + 0` arithmetic in `list_extend_*` functions (#133074)
files:
M Objects/listobject.c
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;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]