(original) (raw)
changeset: 103325:36545fa93d2b user: Victor Stinner victor.stinner@gmail.com date: Thu Sep 08 10:52:46 2016 -0700 files: Objects/dictobject.c description: Add assertions to dk_set_index() Issue #27350. diff -r b4cc62473c13 -r 36545fa93d2b Objects/dictobject.c --- a/Objects/dictobject.c Thu Sep 08 13:59:53 2016 -0400 +++ b/Objects/dictobject.c Thu Sep 08 10:52:46 2016 -0700 @@ -304,20 +304,24 @@ dk_get_index(PyDictKeysObject *keys, Py_ssize_t i) { Py_ssize_t s = DK_SIZE(keys); + Py_ssize_t ix; + if (s <= 0xff) { - return ((char*) &keys->dk_indices[0])[i]; + ix = ((char*) &keys->dk_indices[0])[i]; } else if (s <= 0xffff) { - return ((int16_t*)&keys->dk_indices[0])[i]; + ix = ((int16_t*)&keys->dk_indices[0])[i]; } #if SIZEOF_VOID_P > 4 else if (s <= 0xffffffff) { - return ((int32_t*)&keys->dk_indices[0])[i]; + ix = ((int32_t*)&keys->dk_indices[0])[i]; } #endif else { - return ((Py_ssize_t*)&keys->dk_indices[0])[i]; + ix = ((Py_ssize_t*)&keys->dk_indices[0])[i]; } + assert(ix >= DKIX_DUMMY); + return ix; } /* write to indices. */ @@ -325,14 +329,20 @@ dk_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix) { Py_ssize_t s = DK_SIZE(keys); + + assert(ix >= DKIX_DUMMY); + if (s <= 0xff) { + assert(ix <= 0x7f); ((char*) &keys->dk_indices[0])[i] = (char)ix; } else if (s <= 0xffff) { + assert(ix <= 0x7fff); ((int16_t*) &keys->dk_indices[0])[i] = (int16_t)ix; } #if SIZEOF_VOID_P > 4 else if (s <= 0xffffffff) { + assert(ix <= 0x7fffffff); ((int32_t*) &keys->dk_indices[0])[i] = (int32_t)ix; } #endif /victor.stinner@gmail.com