mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Issue #20037: Avoid crashes when doing text I/O late at interpreter shutdown.
This commit is contained in:
parent
5255b86fba
commit
712cb734bd
9 changed files with 96 additions and 8 deletions
|
@ -539,6 +539,20 @@ _PyIO_ConvertSsize_t(PyObject *obj, void *result) {
|
|||
}
|
||||
|
||||
|
||||
_PyIO_State *
|
||||
_PyIO_get_module_state(void)
|
||||
{
|
||||
PyObject *mod = PyState_FindModule(&_PyIO_Module);
|
||||
_PyIO_State *state;
|
||||
if (mod == NULL || (state = IO_MOD_STATE(mod)) == NULL) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"could not find io module state "
|
||||
"(interpreter shutdown?)");
|
||||
return NULL;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
PyObject *
|
||||
_PyIO_get_locale_module(_PyIO_State *state)
|
||||
{
|
||||
|
|
|
@ -135,8 +135,9 @@ typedef struct {
|
|||
} _PyIO_State;
|
||||
|
||||
#define IO_MOD_STATE(mod) ((_PyIO_State *)PyModule_GetState(mod))
|
||||
#define IO_STATE IO_MOD_STATE(PyState_FindModule(&_PyIO_Module))
|
||||
#define IO_STATE() _PyIO_get_module_state()
|
||||
|
||||
extern _PyIO_State *_PyIO_get_module_state(void);
|
||||
extern PyObject *_PyIO_get_locale_module(_PyIO_State *);
|
||||
|
||||
extern PyObject *_PyIO_str_close;
|
||||
|
|
|
@ -91,7 +91,9 @@ bufferediobase_readinto(PyObject *self, PyObject *args)
|
|||
static PyObject *
|
||||
bufferediobase_unsupported(const char *message)
|
||||
{
|
||||
PyErr_SetString(IO_STATE->unsupported_operation, message);
|
||||
_PyIO_State *state = IO_STATE();
|
||||
if (state != NULL)
|
||||
PyErr_SetString(state->unsupported_operation, message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -493,8 +493,10 @@ err_closed(void)
|
|||
static PyObject *
|
||||
err_mode(char *action)
|
||||
{
|
||||
PyErr_Format(IO_STATE->unsupported_operation,
|
||||
"File not open for %s", action);
|
||||
_PyIO_State *state = IO_STATE();
|
||||
if (state != NULL)
|
||||
PyErr_Format(state->unsupported_operation,
|
||||
"File not open for %s", action);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,9 @@ _Py_IDENTIFIER(read);
|
|||
static PyObject *
|
||||
iobase_unsupported(const char *message)
|
||||
{
|
||||
PyErr_SetString(IO_STATE->unsupported_operation, message);
|
||||
_PyIO_State *state = IO_STATE();
|
||||
if (state != NULL)
|
||||
PyErr_SetString(state->unsupported_operation, message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,9 @@ PyDoc_STRVAR(textiobase_doc,
|
|||
static PyObject *
|
||||
_unsupported(const char *message)
|
||||
{
|
||||
PyErr_SetString(IO_STATE->unsupported_operation, message);
|
||||
_PyIO_State *state = IO_STATE();
|
||||
if (state != NULL)
|
||||
PyErr_SetString(state->unsupported_operation, message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -852,7 +854,7 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
|
|||
char *errors = NULL;
|
||||
char *newline = NULL;
|
||||
int line_buffering = 0, write_through = 0;
|
||||
_PyIO_State *state = IO_STATE;
|
||||
_PyIO_State *state = NULL;
|
||||
|
||||
PyObject *res;
|
||||
int r;
|
||||
|
@ -891,6 +893,9 @@ textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)
|
|||
if (encoding == NULL) {
|
||||
/* Try os.device_encoding(fileno) */
|
||||
PyObject *fileno;
|
||||
state = IO_STATE();
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL);
|
||||
/* Ignore only AttributeError and UnsupportedOperation */
|
||||
if (fileno == NULL) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue