@@ -235,11 +235,12 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
235235 char rawmode [6 ], * m ;
236236 int line_buffering , isatty ;
237237
238- PyObject * raw , * modeobj = NULL , * buffer = NULL , * wrapper = NULL ;
238+ PyObject * raw , * modeobj = NULL , * buffer , * wrapper , * result = NULL ;
239239
240240 _Py_IDENTIFIER (isatty );
241241 _Py_IDENTIFIER (fileno );
242242 _Py_IDENTIFIER (mode );
243+ _Py_IDENTIFIER (close );
243244
244245 if (!PyArg_ParseTupleAndKeywords (args , kwds , "O|sizzziO:open" , kwlist ,
245246 & file , & mode , & buffering ,
@@ -354,6 +355,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
354355 "OsiO" , file , rawmode , closefd , opener );
355356 if (raw == NULL )
356357 return NULL ;
358+ result = raw ;
357359
358360 modeobj = PyUnicode_FromString (mode );
359361 if (modeobj == NULL )
@@ -412,7 +414,7 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
412414 }
413415
414416 Py_DECREF (modeobj );
415- return raw ;
417+ return result ;
416418 }
417419
418420 /* wraps into a buffered file */
@@ -433,15 +435,16 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
433435
434436 buffer = PyObject_CallFunction (Buffered_class , "Oi" , raw , buffering );
435437 }
436- Py_CLEAR (raw );
437438 if (buffer == NULL )
438439 goto error ;
440+ result = buffer ;
441+ Py_DECREF (raw );
439442
440443
441444 /* if binary, returns the buffered file */
442445 if (binary ) {
443446 Py_DECREF (modeobj );
444- return buffer ;
447+ return result ;
445448 }
446449
447450 /* wraps into a TextIOWrapper */
@@ -450,20 +453,35 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
450453 buffer ,
451454 encoding , errors , newline ,
452455 line_buffering );
453- Py_CLEAR (buffer );
454456 if (wrapper == NULL )
455457 goto error ;
458+ result = wrapper ;
459+ Py_DECREF (buffer );
456460
457461 if (_PyObject_SetAttrId (wrapper , & PyId_mode , modeobj ) < 0 )
458462 goto error ;
459463 Py_DECREF (modeobj );
460- return wrapper ;
464+ return result ;
461465
462466 error :
463- Py_XDECREF (raw );
467+ if (result != NULL ) {
468+ PyObject * exc , * val , * tb ;
469+ PyErr_Fetch (& exc , & val , & tb );
470+ if (_PyObject_CallMethodId (result , & PyId_close , NULL ) != NULL )
471+ PyErr_Restore (exc , val , tb );
472+ else {
473+ PyObject * val2 ;
474+ PyErr_NormalizeException (& exc , & val , & tb );
475+ Py_XDECREF (exc );
476+ Py_XDECREF (tb );
477+ PyErr_Fetch (& exc , & val2 , & tb );
478+ PyErr_NormalizeException (& exc , & val2 , & tb );
479+ PyException_SetContext (val2 , val );
480+ PyErr_Restore (exc , val2 , tb );
481+ }
482+ Py_DECREF (result );
483+ }
464484 Py_XDECREF (modeobj );
465- Py_XDECREF (buffer );
466- Py_XDECREF (wrapper );
467485 return NULL ;
468486}
469487
0 commit comments