From 4f616fe140e309a6e5b5542a58b25f3147b04b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 3 Dec 2024 16:50:51 +0100 Subject: [PATCH 1/3] fix UBSan failure in `dictobject.c` --- Objects/dictobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index a13d8084d14d66..54ac6373171d3a 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2012,7 +2012,7 @@ dictresize(PyInterpreterState *interp, PyDictObject *mp, if (unicode) { // combined unicode -> combined unicode PyDictUnicodeEntry *newentries = DK_UNICODE_ENTRIES(newkeys); if (oldkeys->dk_nentries == numentries && mp->ma_keys->dk_kind == DICT_KEYS_UNICODE) { - memcpy(newentries, oldentries, numentries * sizeof(PyDictUnicodeEntry)); + memcpy(newentries, (const void *)oldentries, numentries * sizeof(PyDictUnicodeEntry)); } else { PyDictUnicodeEntry *ep = oldentries; From f164f2432aed601af73b8cb7391b6ed702abcd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:18:44 +0100 Subject: [PATCH 2/3] use `dk_log2_index_bytes=3` in empty dicts --- Objects/dictobject.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 54ac6373171d3a..3c000b9de9100f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -588,11 +588,14 @@ estimate_log2_keysize(Py_ssize_t n) /* This immutable, empty PyDictKeysObject is used for PyDict_Clear() * (which cannot fail and thus can do no allocation). + * + * See https://github.com/python/cpython/pull/127568#discussion_r1868070614 + * for the rationale of using dk_log2_index_bytes=3 instead of 0. */ static PyDictKeysObject empty_keys_struct = { _Py_DICT_IMMORTAL_INITIAL_REFCNT, /* dk_refcnt */ 0, /* dk_log2_size */ - 0, /* dk_log2_index_bytes */ + 3, /* dk_log2_index_bytes */ DICT_KEYS_UNICODE, /* dk_kind */ #ifdef Py_GIL_DISABLED {0}, /* dk_mutex */ From 24b3f981af78afdc060f2f9e96b23e392625d5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:23:51 +0100 Subject: [PATCH 3/3] remove un-necessary cast --- Objects/dictobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 3c000b9de9100f..b97e0fd8d95ade 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2015,7 +2015,7 @@ dictresize(PyInterpreterState *interp, PyDictObject *mp, if (unicode) { // combined unicode -> combined unicode PyDictUnicodeEntry *newentries = DK_UNICODE_ENTRIES(newkeys); if (oldkeys->dk_nentries == numentries && mp->ma_keys->dk_kind == DICT_KEYS_UNICODE) { - memcpy(newentries, (const void *)oldentries, numentries * sizeof(PyDictUnicodeEntry)); + memcpy(newentries, oldentries, numentries * sizeof(PyDictUnicodeEntry)); } else { PyDictUnicodeEntry *ep = oldentries;