From: Ma Lin Date: Mon, 26 Apr 2021 19:50:33 +0000 (+0800) Subject: Fix thread locks in zlib module may go wrong in rare case (#22130) X-Git-Tag: v3.9.5~34 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba7338a46038bdb55159bf37e7ad83f177e5257b;p=thirdparty%2FPython%2Fcpython.git Fix thread locks in zlib module may go wrong in rare case (#22130) Setting `next_in` before acquiring the thread lock may mix up compress/decompress state in other threads. --- 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 index 000000000000..9e36435a364e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-09-07-21-40-07.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 fe27909ae8a7..6c14c3adbf26 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -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);