33#include "pycore_pyerrors.h" // _Py_DumpExtensionModules
44#include "pycore_pystate.h" // _PyThreadState_GET()
55#include "pycore_signal.h" // Py_NSIG
6+ #include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
67#include "pycore_traceback.h" // _Py_DumpTracebackThreads
78
89#include <object.h>
@@ -104,14 +105,13 @@ faulthandler_get_fileno(PyObject **file_ptr)
104105 PyObject * file = * file_ptr ;
105106
106107 if (file == NULL || file == Py_None ) {
107- PyThreadState * tstate = _PyThreadState_GET ();
108- file = _PySys_GetAttr (tstate , & _Py_ID (stderr ));
108+ file = _PySys_GetRequiredAttr (& _Py_ID (stderr ));
109109 if (file == NULL ) {
110- PyErr_SetString (PyExc_RuntimeError , "unable to get sys.stderr" );
111110 return -1 ;
112111 }
113112 if (file == Py_None ) {
114113 PyErr_SetString (PyExc_RuntimeError , "sys.stderr is None" );
114+ Py_DECREF (file );
115115 return -1 ;
116116 }
117117 }
@@ -127,10 +127,15 @@ faulthandler_get_fileno(PyObject **file_ptr)
127127 * file_ptr = NULL ;
128128 return fd ;
129129 }
130+ else {
131+ Py_INCREF (file );
132+ }
130133
131134 result = PyObject_CallMethodNoArgs (file , & _Py_ID (fileno ));
132- if (result == NULL )
135+ if (result == NULL ) {
136+ Py_DECREF (file );
133137 return -1 ;
138+ }
134139
135140 fd = -1 ;
136141 if (PyLong_Check (result )) {
@@ -143,6 +148,7 @@ faulthandler_get_fileno(PyObject **file_ptr)
143148 if (fd == -1 ) {
144149 PyErr_SetString (PyExc_RuntimeError ,
145150 "file.fileno() is not a valid file descriptor" );
151+ Py_DECREF (file );
146152 return -1 ;
147153 }
148154
@@ -225,19 +231,23 @@ faulthandler_dump_traceback_py(PyObject *self,
225231 return NULL ;
226232
227233 tstate = get_thread_state ();
228- if (tstate == NULL )
234+ if (tstate == NULL ) {
235+ Py_XDECREF (file );
229236 return NULL ;
237+ }
230238
231239 if (all_threads ) {
232240 errmsg = _Py_DumpTracebackThreads (fd , NULL , tstate );
233241 if (errmsg != NULL ) {
234242 PyErr_SetString (PyExc_RuntimeError , errmsg );
243+ Py_XDECREF (file );
235244 return NULL ;
236245 }
237246 }
238247 else {
239248 _Py_DumpTraceback (fd , tstate );
240249 }
250+ Py_XDECREF (file );
241251
242252 if (PyErr_CheckSignals ())
243253 return NULL ;
@@ -499,10 +509,11 @@ faulthandler_py_enable(PyObject *self, PyObject *args, PyObject *kwargs)
499509 return NULL ;
500510
501511 tstate = get_thread_state ();
502- if (tstate == NULL )
512+ if (tstate == NULL ) {
513+ Py_XDECREF (file );
503514 return NULL ;
515+ }
504516
505- Py_XINCREF (file );
506517 Py_XSETREF (fatal_error .file , file );
507518 fatal_error .fd = fd ;
508519 fatal_error .all_threads = all_threads ;
@@ -692,12 +703,14 @@ faulthandler_dump_traceback_later(PyObject *self,
692703 if (!thread .running ) {
693704 thread .running = PyThread_allocate_lock ();
694705 if (!thread .running ) {
706+ Py_XDECREF (file );
695707 return PyErr_NoMemory ();
696708 }
697709 }
698710 if (!thread .cancel_event ) {
699711 thread .cancel_event = PyThread_allocate_lock ();
700712 if (!thread .cancel_event || !thread .running ) {
713+ Py_XDECREF (file );
701714 return PyErr_NoMemory ();
702715 }
703716
@@ -709,14 +722,14 @@ faulthandler_dump_traceback_later(PyObject *self,
709722 /* format the timeout */
710723 header = format_timeout (timeout_us );
711724 if (header == NULL ) {
725+ Py_XDECREF (file );
712726 return PyErr_NoMemory ();
713727 }
714728 header_len = strlen (header );
715729
716730 /* Cancel previous thread, if running */
717731 cancel_dump_traceback_later ();
718732
719- Py_XINCREF (file );
720733 Py_XSETREF (thread .file , file );
721734 thread .fd = fd ;
722735 /* the downcast is safe: we check that 0 < timeout_us < PY_TIMEOUT_MAX */
@@ -878,28 +891,31 @@ faulthandler_register_py(PyObject *self,
878891
879892 if (user_signals == NULL ) {
880893 user_signals = PyMem_Calloc (Py_NSIG , sizeof (user_signal_t ));
881- if (user_signals == NULL )
894+ if (user_signals == NULL ) {
895+ Py_XDECREF (file );
882896 return PyErr_NoMemory ();
897+ }
883898 }
884899 user = & user_signals [signum ];
885900
886901 if (!user -> enabled ) {
887902#ifdef FAULTHANDLER_USE_ALT_STACK
888903 if (faulthandler_allocate_stack () < 0 ) {
904+ Py_XDECREF (file );
889905 return NULL ;
890906 }
891907#endif
892908
893909 err = faulthandler_register (signum , chain , & previous );
894910 if (err ) {
895911 PyErr_SetFromErrno (PyExc_OSError );
912+ Py_XDECREF (file );
896913 return NULL ;
897914 }
898915
899916 user -> previous = previous ;
900917 }
901918
902- Py_XINCREF (file );
903919 Py_XSETREF (user -> file , file );
904920 user -> fd = fd ;
905921 user -> all_threads = all_threads ;
0 commit comments