From 631160c262b40bf4ce3da6cd7bbb972ae2e9fc91 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Mon, 18 Jul 2022 19:18:04 +0530 Subject: [PATCH] GH-94857: fix test_io refleak (GH-94858) --- .../Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst | 1 + Modules/_io/textio.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst diff --git a/Misc/NEWS.d/next/Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst b/Misc/NEWS.d/next/Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst new file mode 100644 index 00000000000..e684415595d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst @@ -0,0 +1 @@ +Fix refleak in ``_io.TextIOWrapper.reconfigure``. Patch by Kumar Aditya. diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 660396b8b03..89094d66f38 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1247,6 +1247,7 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding, if (errors == Py_None) { errors = self->errors; } + Py_INCREF(encoding); } else { if (_PyUnicode_EqualToASCIIString(encoding, "locale")) { @@ -1254,6 +1255,8 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding, if (encoding == NULL) { return -1; } + } else { + Py_INCREF(encoding); } if (errors == Py_None) { errors = &_Py_ID(strict); @@ -1262,6 +1265,7 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding, const char *c_errors = PyUnicode_AsUTF8(errors); if (c_errors == NULL) { + Py_DECREF(encoding); return -1; } @@ -1269,16 +1273,17 @@ textiowrapper_change_encoding(textio *self, PyObject *encoding, PyObject *codec_info = _PyCodec_LookupTextEncoding( PyUnicode_AsUTF8(encoding), "codecs.open()"); if (codec_info == NULL) { + Py_DECREF(encoding); return -1; } if (_textiowrapper_set_decoder(self, codec_info, c_errors) != 0 || _textiowrapper_set_encoder(self, codec_info, c_errors) != 0) { Py_DECREF(codec_info); + Py_DECREF(encoding); return -1; } Py_DECREF(codec_info); - Py_INCREF(encoding); Py_INCREF(errors); Py_SETREF(self->encoding, encoding); Py_SETREF(self->errors, errors);