Issue #14373: Fixed segmentation fault when gc.collect() is called during

constructing lru_cache (C implementation).
This commit is contained in:
Serhiy Storchaka 2015-07-25 12:11:00 +03:00
commit 8932cd169c
2 changed files with 9 additions and 5 deletions

View File

@ -57,6 +57,9 @@ Core and Builtins
Library Library
------- -------
- Issue #14373: Fixed segmentation fault when gc.collect() is called during
constructing lru_cache (C implementation).
- Issue #24695: Fix a regression in traceback.print_exception(). If - Issue #24695: Fix a regression in traceback.print_exception(). If
exc_traceback is None we shouldn't print a traceback header like described exc_traceback is None we shouldn't print a traceback header like described
in the documentation. in the documentation.

View File

@ -899,7 +899,7 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds
static PyObject * static PyObject *
lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw) lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{ {
PyObject *func, *maxsize_O, *cache_info_type; PyObject *func, *maxsize_O, *cache_info_type, *cachedict;
int typed; int typed;
lru_cache_object *obj; lru_cache_object *obj;
Py_ssize_t maxsize; Py_ssize_t maxsize;
@ -937,15 +937,16 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw)
return NULL; return NULL;
} }
obj = (lru_cache_object *)type->tp_alloc(type, 0); if (!(cachedict = PyDict_New()))
if (obj == NULL)
return NULL; return NULL;
if (!(obj->cache = PyDict_New())) { obj = (lru_cache_object *)type->tp_alloc(type, 0);
Py_DECREF(obj); if (obj == NULL) {
Py_DECREF(cachedict);
return NULL; return NULL;
} }
obj->cache = cachedict;
obj->root.prev = &obj->root; obj->root.prev = &obj->root;
obj->root.next = &obj->root; obj->root.next = &obj->root;
obj->maxsize = maxsize; obj->maxsize = maxsize;