summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-05-28 15:41:36 (GMT)
committerGeorg Brandl <georg@python.org>2008-05-28 15:41:36 (GMT)
commit5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da (patch)
treed999590ad5aaf1da9896c092d42c85c836bbfb8a
parentdee01d8af800b0bb4aac1a9006873b81aace1c5c (diff)
downloadcpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.zip
cpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.tar.gz
cpython-5ec330cb2f1b041ebba6dedb6a02cd27a7e9f3da.tar.bz2
#2990: prevent inconsistent state while updating method cache.
-rw-r--r--Objects/typeobject.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 151ea69..70fd1f2 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -147,7 +147,7 @@ assign_version_tag(PyTypeObject *type)
cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG.
*/
Py_ssize_t i, n;
- PyObject *bases;
+ PyObject *bases, *tmp;
if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
return 1;
@@ -166,9 +166,10 @@ assign_version_tag(PyTypeObject *type)
are borrowed reference */
for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
method_cache[i].value = NULL;
- Py_XDECREF(method_cache[i].name);
- method_cache[i].name = Py_None;
+ tmp = method_cache[i].name;
Py_INCREF(Py_None);
+ method_cache[i].name = Py_None;
+ Py_XDECREF(tmp);
}
/* mark all version tags as invalid */
PyType_Modified(&PyBaseObject_Type);
@@ -2413,7 +2414,7 @@ PyObject *
_PyType_Lookup(PyTypeObject *type, PyObject *name)
{
Py_ssize_t i, n;
- PyObject *mro, *res, *base, *dict;
+ PyObject *mro, *res, *base, *dict, *tmp;
unsigned int h;
if (MCACHE_CACHEABLE_NAME(name) &&
@@ -2455,9 +2456,10 @@ _PyType_Lookup(PyTypeObject *type, PyObject *name)
h = MCACHE_HASH_METHOD(type, name);
method_cache[h].version = type->tp_version_tag;
method_cache[h].value = res; /* borrowed */
+ tmp = method_cache[h].name;
Py_INCREF(name);
- Py_DECREF(method_cache[h].name);
method_cache[h].name = name;
+ Py_DECREF(tmp);
}
return res;
}