@@ -101,7 +101,7 @@ get_default_action(void)
101
101
}
102
102
103
103
104
- /* The item is a borrowed reference. */
104
+ /* The item is a new reference. */
105
105
static PyObject *
106
106
get_filter (PyObject * category , PyObject * text , Py_ssize_t lineno ,
107
107
PyObject * module , PyObject * * item )
@@ -132,43 +132,59 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno,
132
132
Py_ssize_t ln ;
133
133
int is_subclass , good_msg , good_mod ;
134
134
135
- tmp_item = * item = PyList_GET_ITEM (_filters , i );
136
- if (PyTuple_Size (tmp_item ) != 5 ) {
135
+ tmp_item = PyList_GET_ITEM (_filters , i );
136
+ if (! PyTuple_Check ( tmp_item ) || PyTuple_GET_SIZE (tmp_item ) != 5 ) {
137
137
PyErr_Format (PyExc_ValueError ,
138
138
MODULE_NAME ".filters item %zd isn't a 5-tuple" , i );
139
139
return NULL ;
140
140
}
141
141
142
142
/* Python code: action, msg, cat, mod, ln = item */
143
+ Py_INCREF (tmp_item );
143
144
action = PyTuple_GET_ITEM (tmp_item , 0 );
144
145
msg = PyTuple_GET_ITEM (tmp_item , 1 );
145
146
cat = PyTuple_GET_ITEM (tmp_item , 2 );
146
147
mod = PyTuple_GET_ITEM (tmp_item , 3 );
147
148
ln_obj = PyTuple_GET_ITEM (tmp_item , 4 );
148
149
149
150
good_msg = check_matched (msg , text );
150
- if (good_msg == -1 )
151
+ if (good_msg == -1 ) {
152
+ Py_DECREF (tmp_item );
151
153
return NULL ;
154
+ }
152
155
153
156
good_mod = check_matched (mod , module );
154
- if (good_mod == -1 )
157
+ if (good_mod == -1 ) {
158
+ Py_DECREF (tmp_item );
155
159
return NULL ;
160
+ }
156
161
157
162
is_subclass = PyObject_IsSubclass (category , cat );
158
- if (is_subclass == -1 )
163
+ if (is_subclass == -1 ) {
164
+ Py_DECREF (tmp_item );
159
165
return NULL ;
166
+ }
160
167
161
168
ln = PyLong_AsSsize_t (ln_obj );
162
- if (ln == -1 && PyErr_Occurred ())
169
+ if (ln == -1 && PyErr_Occurred ()) {
170
+ Py_DECREF (tmp_item );
163
171
return NULL ;
172
+ }
164
173
165
- if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln ))
174
+ if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln )) {
175
+ * item = tmp_item ;
166
176
return action ;
177
+ }
178
+
179
+ Py_DECREF (tmp_item );
167
180
}
168
181
169
182
action = get_default_action ();
170
- if (action != NULL )
183
+ if (action != NULL ) {
184
+ Py_INCREF (Py_None );
185
+ * item = Py_None ;
171
186
return action ;
187
+ }
172
188
173
189
PyErr_SetString (PyExc_ValueError ,
174
190
MODULE_NAME ".defaultaction not found" );
@@ -349,7 +365,7 @@ warn_explicit(PyObject *category, PyObject *message,
349
365
PyObject * module , PyObject * registry , PyObject * sourceline )
350
366
{
351
367
PyObject * key = NULL , * text = NULL , * result = NULL , * lineno_obj = NULL ;
352
- PyObject * item = Py_None ;
368
+ PyObject * item = NULL ;
353
369
PyObject * action ;
354
370
int rc ;
355
371
@@ -488,6 +504,7 @@ warn_explicit(PyObject *category, PyObject *message,
488
504
Py_INCREF (result );
489
505
490
506
cleanup :
507
+ Py_XDECREF (item );
491
508
Py_XDECREF (key );
492
509
Py_XDECREF (text );
493
510
Py_XDECREF (lineno_obj );
0 commit comments