@@ -753,43 +753,55 @@ buffer_access_safe(textio *self)
753753 return NULL ;
754754 }
755755
756- /* Returning a borrowed reference is safe since TextIOWrapper methods are
757- protected by critical sections . */
756+ /* The critical section protects this borrowed reference until the caller
757+ can acquire its own reference . */
758758 _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (self );
759759 return self -> buffer ;
760760}
761761
762+ static PyObject *
763+ buffer_acquire_safe (textio * self )
764+ {
765+ return Py_XNewRef (buffer_access_safe (self ));
766+ }
767+
762768static PyObject *
763769buffer_getattr (textio * self , PyObject * attr_name )
764770{
765- PyObject * buffer = buffer_access_safe (self );
771+ PyObject * buffer = buffer_acquire_safe (self );
766772 if (buffer == NULL ) {
767773 return NULL ;
768774 }
769775
770- return PyObject_GetAttr (buffer , attr_name );
776+ PyObject * res = PyObject_GetAttr (buffer , attr_name );
777+ Py_DECREF (buffer );
778+ return res ;
771779}
772780
773781static PyObject *
774782buffer_callmethod_noargs (textio * self , PyObject * name )
775783{
776- PyObject * buffer = buffer_access_safe (self );
784+ PyObject * buffer = buffer_acquire_safe (self );
777785 if (buffer == NULL ) {
778786 return NULL ;
779787 }
780788
781- return PyObject_CallMethodNoArgs (buffer , name );
789+ PyObject * res = PyObject_CallMethodNoArgs (buffer , name );
790+ Py_DECREF (buffer );
791+ return res ;
782792}
783793
784794static PyObject *
785795buffer_callmethod_onearg (textio * self , PyObject * name , PyObject * arg )
786796{
787- PyObject * buffer = buffer_access_safe (self );
797+ PyObject * buffer = buffer_acquire_safe (self );
788798 if (buffer == NULL ) {
789799 return NULL ;
790800 }
791801
792- return PyObject_CallMethodOneArg (buffer , name , arg );
802+ PyObject * res = PyObject_CallMethodOneArg (buffer , name , arg );
803+ Py_DECREF (buffer );
804+ return res ;
793805}
794806
795807static void
@@ -1862,8 +1874,13 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text)
18621874 }
18631875
18641876 if (needflush ) {
1865- PyObject * buffer = buffer_access_safe (self );
1866- if (buffer == NULL || _PyFile_Flush (buffer ) < 0 ) {
1877+ PyObject * buffer = buffer_acquire_safe (self );
1878+ if (buffer == NULL ) {
1879+ return NULL ;
1880+ }
1881+ int res = _PyFile_Flush (buffer );
1882+ Py_DECREF (buffer );
1883+ if (res < 0 ) {
18671884 return NULL ;
18681885 }
18691886 }
@@ -2677,11 +2694,12 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence)
26772694 Py_DECREF (res );
26782695 }
26792696
2680- PyObject * buf = buffer_access_safe (self );
2697+ PyObject * buf = buffer_acquire_safe (self );
26812698 if (buf == NULL ) {
26822699 goto fail ;
26832700 }
26842701 res = _PyObject_CallMethod (buf , & _Py_ID (seek ), "ii" , 0 , 2 );
2702+ Py_DECREF (buf );
26852703 Py_CLEAR (cookieObj );
26862704 if (res == NULL )
26872705 goto fail ;
@@ -3439,7 +3457,7 @@ static PyObject *
34393457_io_TextIOWrapper_buffer_get_impl (textio * self )
34403458/*[clinic end generated code: output=d265a34555aa5d4b input=5951cfa148f7350a]*/
34413459{
3442- return Py_XNewRef ( buffer_access_safe ( self ) );
3460+ return buffer_acquire_safe ( self );
34433461}
34443462
34453463static PyMethodDef incrementalnewlinedecoder_methods [] = {
0 commit comments