summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2022-07-15-08-13-51.gh-issue-94857.9_KvZJ.rst1
-rw-r--r--Modules/_io/textio.c7
2 files changed, 7 insertions, 1 deletions
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 0000000..e684415
--- /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 660396b..89094d6 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);