@@ -362,16 +362,24 @@ _enter_buffered_busy(buffered *self)
362362 }
363363
364364#define IS_CLOSED (self ) \
365- (!self->buffer || \
365+ (!self->buffer ? 1 : \
366366 (self->fast_closed_checks \
367367 ? _PyFileIO_closed(self->raw) \
368368 : buffered_closed(self)))
369369
370370#define CHECK_CLOSED (self , error_msg ) \
371- if (IS_CLOSED(self) && (Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t) == 0)) { \
372- PyErr_SetString(PyExc_ValueError, error_msg); \
373- return NULL; \
374- } \
371+ do { \
372+ int _closed = IS_CLOSED(self); \
373+ if (_closed < 0) { \
374+ return NULL; \
375+ } \
376+ if (_closed && \
377+ (Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t) == 0)) \
378+ { \
379+ PyErr_SetString(PyExc_ValueError, error_msg); \
380+ return NULL; \
381+ } \
382+ } while (0);
375383
376384#define VALID_READ_BUFFER (self ) \
377385 (self->readable && self->read_end != -1)
@@ -2079,6 +2087,7 @@ _io_BufferedWriter_write_impl(buffered *self, Py_buffer *buffer)
20792087 PyObject * res = NULL ;
20802088 Py_ssize_t written , avail , remaining ;
20812089 Py_off_t offset ;
2090+ int r ;
20822091
20832092 CHECK_INITIALIZED (self )
20842093
@@ -2087,7 +2096,11 @@ _io_BufferedWriter_write_impl(buffered *self, Py_buffer *buffer)
20872096
20882097 /* Issue #31976: Check for closed file after acquiring the lock. Another
20892098 thread could be holding the lock while closing the file. */
2090- if (IS_CLOSED (self )) {
2099+ r = IS_CLOSED (self );
2100+ if (r < 0 ) {
2101+ goto error ;
2102+ }
2103+ if (r > 0 ) {
20912104 PyErr_SetString (PyExc_ValueError , "write to closed file" );
20922105 goto error ;
20932106 }
0 commit comments