Skip to content

Commit

Permalink
gh-111942: Fix SystemError in the TextIOWrapper constructor
Browse files Browse the repository at this point in the history
In non-debug more the check for the "errors" argument is skipped,
and then PyUnicode_AsUTF8() can fail, but its result was not checked.
  • Loading branch information
serhiy-storchaka committed Nov 14, 2023
1 parent 0ff6368 commit 0a85bf3
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix SystemError in the TextIOWrapper constructor with non-encodable "errors"
argument in non-debug mode.
8 changes: 6 additions & 2 deletions Modules/_io/textio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1112,6 +1112,10 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
else if (io_check_errors(errors)) {
return -1;
}
const char *errors_str = PyUnicode_AsUTF8(errors);
if (errors_str == NULL) {
return -1;
}

if (validate_newline(newline) < 0) {
return -1;
Expand Down Expand Up @@ -1184,11 +1188,11 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
/* Build the decoder object */
_PyIO_State *state = find_io_state_by_def(Py_TYPE(self));
self->state = state;
if (_textiowrapper_set_decoder(self, codec_info, PyUnicode_AsUTF8(errors)) != 0)
if (_textiowrapper_set_decoder(self, codec_info, errors_str) != 0)
goto error;

/* Build the encoder object */
if (_textiowrapper_set_encoder(self, codec_info, PyUnicode_AsUTF8(errors)) != 0)
if (_textiowrapper_set_encoder(self, codec_info, errors_str) != 0)
goto error;

/* Finished sorting out the codec details */
Expand Down

0 comments on commit 0a85bf3

Please sign in to comment.