44#include "pycore_pyerrors.h" // _Py_DumpExtensionModules
55#include "pycore_pystate.h" // _PyThreadState_GET()
66#include "pycore_signal.h" // Py_NSIG
7- #include "pycore_sysmodule.h" // _PySys_GetAttr ()
7+ #include "pycore_sysmodule.h" // _PySys_GetRequiredAttr ()
88#include "pycore_time.h" // _PyTime_FromSecondsObject()
99#include "pycore_traceback.h" // _Py_DumpTracebackThreads
1010
@@ -112,14 +112,13 @@ faulthandler_get_fileno(PyObject **file_ptr)
112112 PyObject * file = * file_ptr ;
113113
114114 if (file == NULL || file == Py_None ) {
115- PyThreadState * tstate = _PyThreadState_GET ();
116- file = _PySys_GetAttr (tstate , & _Py_ID (stderr ));
115+ file = _PySys_GetRequiredAttr (& _Py_ID (stderr ));
117116 if (file == NULL ) {
118- PyErr_SetString (PyExc_RuntimeError , "unable to get sys.stderr" );
119117 return -1 ;
120118 }
121119 if (file == Py_None ) {
122120 PyErr_SetString (PyExc_RuntimeError , "sys.stderr is None" );
121+ Py_DECREF (file );
123122 return -1 ;
124123 }
125124 }
@@ -142,10 +141,15 @@ faulthandler_get_fileno(PyObject **file_ptr)
142141 * file_ptr = NULL ;
143142 return fd ;
144143 }
144+ else {
145+ Py_INCREF (file );
146+ }
145147
146148 result = PyObject_CallMethodNoArgs (file , & _Py_ID (fileno ));
147- if (result == NULL )
149+ if (result == NULL ) {
150+ Py_DECREF (file );
148151 return -1 ;
152+ }
149153
150154 fd = -1 ;
151155 if (PyLong_Check (result )) {
@@ -158,6 +162,7 @@ faulthandler_get_fileno(PyObject **file_ptr)
158162 if (fd == -1 ) {
159163 PyErr_SetString (PyExc_RuntimeError ,
160164 "file.fileno() is not a valid file descriptor" );
165+ Py_DECREF (file );
161166 return -1 ;
162167 }
163168
@@ -240,8 +245,10 @@ faulthandler_dump_traceback_py(PyObject *self,
240245 return NULL ;
241246
242247 tstate = get_thread_state ();
243- if (tstate == NULL )
248+ if (tstate == NULL ) {
249+ Py_XDECREF (file );
244250 return NULL ;
251+ }
245252
246253 if (all_threads ) {
247254 PyInterpreterState * interp = _PyInterpreterState_GET ();
@@ -252,12 +259,14 @@ faulthandler_dump_traceback_py(PyObject *self,
252259 _PyEval_StartTheWorld (interp );
253260 if (errmsg != NULL ) {
254261 PyErr_SetString (PyExc_RuntimeError , errmsg );
262+ Py_XDECREF (file );
255263 return NULL ;
256264 }
257265 }
258266 else {
259267 _Py_DumpTraceback (fd , tstate );
260268 }
269+ Py_XDECREF (file );
261270
262271 if (PyErr_CheckSignals ())
263272 return NULL ;
@@ -540,10 +549,11 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs)
540549 return NULL ;
541550
542551 tstate = get_thread_state ();
543- if (tstate == NULL )
552+ if (tstate == NULL ) {
553+ Py_XDECREF (file );
544554 return NULL ;
555+ }
545556
546- Py_XINCREF (file );
547557 Py_XSETREF (fatal_error .file , file );
548558 fatal_error .fd = fd ;
549559 fatal_error .all_threads = all_threads ;
@@ -733,12 +743,14 @@ faulthandler_dump_traceback_later(PyObject *self,
733743 if (!thread .running ) {
734744 thread .running = PyThread_allocate_lock ();
735745 if (!thread .running ) {
746+ Py_XDECREF (file );
736747 return PyErr_NoMemory ();
737748 }
738749 }
739750 if (!thread .cancel_event ) {
740751 thread .cancel_event = PyThread_allocate_lock ();
741752 if (!thread .cancel_event || !thread .running ) {
753+ Py_XDECREF (file );
742754 return PyErr_NoMemory ();
743755 }
744756
@@ -750,14 +762,14 @@ faulthandler_dump_traceback_later(PyObject *self,
750762 /* format the timeout */
751763 header = format_timeout (timeout_us );
752764 if (header == NULL ) {
765+ Py_XDECREF (file );
753766 return PyErr_NoMemory ();
754767 }
755768 header_len = strlen (header );
756769
757770 /* Cancel previous thread, if running */
758771 cancel_dump_traceback_later ();
759772
760- Py_XINCREF (file );
761773 Py_XSETREF (thread .file , file );
762774 thread .fd = fd ;
763775 /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */
@@ -919,28 +931,31 @@ faulthandler_register_py(PyObject *self,
919931
920932 if (user_signals == NULL ) {
921933 user_signals = PyMem_Calloc (Py_NSIG , sizeof (user_signal_t ));
922- if (user_signals == NULL )
934+ if (user_signals == NULL ) {
935+ Py_XDECREF (file );
923936 return PyErr_NoMemory ();
937+ }
924938 }
925939 user = & user_signals [signum ];
926940
927941 if (!user -> enabled ) {
928942#ifdef FAULTHANDLER_USE_ALT_STACK
929943 if (faulthandler_allocate_stack () < 0 ) {
944+ Py_XDECREF (file );
930945 return NULL ;
931946 }
932947#endif
933948
934949 err = faulthandler_register (signum , chain , & previous );
935950 if (err ) {
936951 PyErr_SetFromErrno (PyExc_OSError );
952+ Py_XDECREF (file );
937953 return NULL ;
938954 }
939955
940956 user -> previous = previous ;
941957 }
942958
943- Py_XINCREF (file );
944959 Py_XSETREF (user -> file , file );
945960 user -> fd = fd ;
946961 user -> all_threads = all_threads ;
0 commit comments