From 1094891b2e3eafef464819acd4cd04cfd2b59661 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 23 Jun 2018 15:06:11 +0200 Subject: [PATCH] bpo-33916: Fix bz2 and lzma init when called twice (GH-7843) (GH-7872) bz2, lzma: When Decompressor.__init__() is called twice, free the old lock to not leak memory. (cherry picked from commit 9b7cf757213cf4d7ae1d436d86ad53f5ba362d55) --- .../next/Library/2018-06-21-11-35-47.bpo-33916.cZgPCD.rst | 2 ++ Modules/_bz2module.c | 8 ++++++-- Modules/_lzmamodule.c | 8 ++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-06-21-11-35-47.bpo-33916.cZgPCD.rst diff --git a/Misc/NEWS.d/next/Library/2018-06-21-11-35-47.bpo-33916.cZgPCD.rst b/Misc/NEWS.d/next/Library/2018-06-21-11-35-47.bpo-33916.cZgPCD.rst new file mode 100644 index 0000000000..65b9d2bf89 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-06-21-11-35-47.bpo-33916.cZgPCD.rst @@ -0,0 +1,2 @@ +bz2 and lzma: When Decompressor.__init__() is called twice, free the old +lock to not leak memory. diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c index 9c5a631eff..3f55599231 100644 --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -652,11 +652,15 @@ _bz2_BZ2Decompressor___init___impl(BZ2Decompressor *self) int bzerror; #ifdef WITH_THREAD - self->lock = PyThread_allocate_lock(); - if (self->lock == NULL) { + PyThread_type_lock lock = PyThread_allocate_lock(); + if (lock == NULL) { PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock"); return -1; } + if (self->lock != NULL) { + PyThread_free_lock(self->lock); + } + self->lock = lock; #endif self->needs_input = 1; diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c index b25faff5ac..c265507ff5 100644 --- a/Modules/_lzmamodule.c +++ b/Modules/_lzmamodule.c @@ -1181,11 +1181,15 @@ _lzma_LZMADecompressor___init___impl(Decompressor *self, int format, self->lzs.next_in = NULL; #ifdef WITH_THREAD - self->lock = PyThread_allocate_lock(); - if (self->lock == NULL) { + PyThread_type_lock lock = PyThread_allocate_lock(); + if (lock == NULL) { PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock"); return -1; } + if (self->lock != NULL) { + PyThread_free_lock(self->lock); + } + self->lock = lock; #endif self->check = LZMA_CHECK_UNKNOWN; -- 2.40.0