[3.8] bpo-41735: Fix thread locks in zlib module may go wrong in rare case
diff --git a/Misc/NEWS.d/next/Library/2020-09-07-21-51-17.bpo-41735.NKqGKy.rst b/Misc/NEWS.d/next/Library/2020-09-07-21-51-17.bpo-41735.NKqGKy.rst
new file mode 100644
index 00000000000000..9e36435a364eaf
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-09-07-21-51-17.bpo-41735.NKqGKy.rst
@@ -0,0 +1 @@
+Fix thread locks in zlib module may go wrong in rare case. Patch by Ma Lin.
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index a3d9ed6646dec8..d6b6b01d89a174 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -653,11 +653,11 @@ zlib_Compress_compress_impl(compobject *self, Py_buffer *data)
     Py_ssize_t ibuflen, obuflen = DEF_BUF_SIZE;
     int err;
 
+    ENTER_ZLIB(self);
+
     self->zst.next_in = data->buf;
     ibuflen = data->len;
 
-    ENTER_ZLIB(self);
-
     do {
         arrange_input_buffer(&self->zst, &ibuflen);
 
@@ -771,6 +771,8 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data,
     else
         hard_limit = max_length;
 
+    ENTER_ZLIB(self);
+
     self->zst.next_in = data->buf;
     ibuflen = data->len;
 
@@ -778,8 +780,6 @@ zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data,
     if (max_length && obuflen > max_length)
         obuflen = max_length;
 
-    ENTER_ZLIB(self);
-
     do {
         arrange_input_buffer(&self->zst, &ibuflen);
 



<!-- issue-number: [bpo-41735](https://bugs.python.org/issue41735) -->
https://bugs.python.org/issue41735
<!-- /issue-number -->
