]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add assertions to dk_set_index()
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 8 Sep 2016 17:52:46 +0000 (10:52 -0700)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 8 Sep 2016 17:52:46 +0000 (10:52 -0700)
Issue #27350.

Objects/dictobject.c

index 866a23397aaedfd96ad95f3c28bb36e296005ebf..98515e9dabf2d3101c6e8422913103c834444ba9 100644 (file)
@@ -304,20 +304,24 @@ static inline Py_ssize_t
 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 @@ static inline void
 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