]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix thread locks in zlib module may go wrong in rare case (#22130)
authorMa Lin <animalize@users.noreply.github.com>
Mon, 26 Apr 2021 19:50:33 +0000 (03:50 +0800)
committerGitHub <noreply@github.com>
Mon, 26 Apr 2021 19:50:33 +0000 (21:50 +0200)
Setting `next_in` before acquiring the thread lock may mix up compress/decompress state in other threads.

Misc/NEWS.d/next/Library/2020-09-07-21-40-07.bpo-41735.NKqGKy.rst [new file with mode: 0644]
Modules/zlibmodule.c

diff --git a/Misc/NEWS.d/next/Library/2020-09-07-21-40-07.bpo-41735.NKqGKy.rst b/Misc/NEWS.d/next/Library/2020-09-07-21-40-07.bpo-41735.NKqGKy.rst
new file mode 100644 (file)
index 0000000..9e36435
--- /dev/null
@@ -0,0 +1 @@
+Fix thread locks in zlib module may go wrong in rare case. Patch by Ma Lin.
index fe27909ae8a75a64780c42adc4caef876dd87c8e..6c14c3adbf268febc66b0914de737a3843b59229 100644 (file)
@@ -667,11 +667,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);
 
@@ -785,6 +785,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;
 
@@ -792,8 +794,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);