diff options
| author | Serhiy Storchaka <storchaka@gmail.com> | 2015-07-25 09:11:00 (GMT) |
|---|---|---|
| committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-07-25 09:11:00 (GMT) |
| commit | 8932cd169ce409e73168a734887bf83643273f04 (patch) | |
| tree | 080b59998c6dedf83dcb7c102a5b21883c960bb8 | |
| parent | 9625340cc8ca426d0f339d460022955bc01155fd (diff) | |
| parent | 374164c2f5a2f95f74cc9b97d4b58d7c74ff3a94 (diff) | |
| download | cpython-8932cd169ce409e73168a734887bf83643273f04.zip cpython-8932cd169ce409e73168a734887bf83643273f04.tar.gz cpython-8932cd169ce409e73168a734887bf83643273f04.tar.bz2 | |
Issue #14373: Fixed segmentation fault when gc.collect() is called during
constructing lru_cache (C implementation).
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Modules/_functoolsmodule.c | 11 |
2 files changed, 9 insertions, 5 deletions
@@ -57,6 +57,9 @@ Core and Builtins 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 exc_traceback is None we shouldn't print a traceback header like described in the documentation. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 95b5b13..dc64cfe 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -899,7 +899,7 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds static PyObject * 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; lru_cache_object *obj; Py_ssize_t maxsize; @@ -937,15 +937,16 @@ lru_cache_new(PyTypeObject *type, PyObject *args, PyObject *kw) return NULL; } - obj = (lru_cache_object *)type->tp_alloc(type, 0); - if (obj == NULL) + if (!(cachedict = PyDict_New())) return NULL; - if (!(obj->cache = PyDict_New())) { - Py_DECREF(obj); + obj = (lru_cache_object *)type->tp_alloc(type, 0); + if (obj == NULL) { + Py_DECREF(cachedict); return NULL; } + obj->cache = cachedict; obj->root.prev = &obj->root; obj->root.next = &obj->root; obj->maxsize = maxsize; |
