Skip to content

Commit 98a9722

Browse files
Issue #20437: Fixed 43 potential bugs when deleting objects references.
1 parent 2cfae9b commit 98a9722

File tree

18 files changed

+45
-82
lines changed

18 files changed

+45
-82
lines changed

Mac/Modules/carbonevt/_CarbonEvtmodule.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,8 +1051,7 @@ static PyObject *EventHandlerRef_RemoveEventHandler(EventHandlerRefObject *_self
10511051
_err = RemoveEventHandler(_self->ob_itself);
10521052
if (_err != noErr) return PyMac_Error(_err);
10531053
_self->ob_itself = NULL;
1054-
Py_DECREF(_self->ob_callback);
1055-
_self->ob_callback = NULL;
1054+
Py_CLEAR(_self->ob_callback);
10561055
Py_INCREF(Py_None);
10571056
_res = Py_None;
10581057
return _res;

Mac/Modules/list/_Listmodule.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ int ListObj_Convert(PyObject *v, ListHandle *p_itself)
7676

7777
static void ListObj_dealloc(ListObject *self)
7878
{
79-
Py_XDECREF(self->ob_ldef_func);
80-
self->ob_ldef_func = NULL;
79+
Py_CLEAR(self->ob_ldef_func);
8180
SetListRefCon(self->ob_itself, (long)0);
8281
if (self->ob_must_be_disposed && self->ob_itself) LDispose(self->ob_itself);
8382
self->ob_type->tp_free((PyObject *)self);

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ What's New in Python 2.7.7?
99
Core and Builtins
1010
-----------------
1111

12+
- Issue #20437: Fixed 43 potential bugs when deleting objects references.
13+
1214
- Issue #20494: Ensure that free()d memory arenas are really released on POSIX
1315
systems supporting anonymous memory mappings. Patch by Charles-François
1416
Natali.

Modules/_bsddb.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -949,8 +949,7 @@ newDBObject(DBEnvObject* arg, int flags)
949949
* DBTxns and closing any open DBs first. */
950950
if (makeDBError(err)) {
951951
if (self->myenvobj) {
952-
Py_DECREF(self->myenvobj);
953-
self->myenvobj = NULL;
952+
Py_CLEAR(self->myenvobj);
954953
}
955954
Py_DECREF(self);
956955
self = NULL;
@@ -982,20 +981,16 @@ DB_dealloc(DBObject* self)
982981
PyObject_ClearWeakRefs((PyObject *) self);
983982
}
984983
if (self->myenvobj) {
985-
Py_DECREF(self->myenvobj);
986-
self->myenvobj = NULL;
984+
Py_CLEAR(self->myenvobj);
987985
}
988986
if (self->associateCallback != NULL) {
989-
Py_DECREF(self->associateCallback);
990-
self->associateCallback = NULL;
987+
Py_CLEAR(self->associateCallback);
991988
}
992989
if (self->btCompareCallback != NULL) {
993-
Py_DECREF(self->btCompareCallback);
994-
self->btCompareCallback = NULL;
990+
Py_CLEAR(self->btCompareCallback);
995991
}
996992
if (self->dupCompareCallback != NULL) {
997-
Py_DECREF(self->dupCompareCallback);
998-
self->dupCompareCallback = NULL;
993+
Py_CLEAR(self->dupCompareCallback);
999994
}
1000995
Py_DECREF(self->private_obj);
1001996
PyObject_Del(self);
@@ -1160,8 +1155,7 @@ DBEnv_dealloc(DBEnvObject* self)
11601155
PyErr_Clear();
11611156
}
11621157

1163-
Py_XDECREF(self->event_notifyCallback);
1164-
self->event_notifyCallback = NULL;
1158+
Py_CLEAR(self->event_notifyCallback);
11651159

11661160
if (self->in_weakreflist != NULL) {
11671161
PyObject_ClearWeakRefs((PyObject *) self);
@@ -1640,8 +1634,7 @@ DB_associate(DBObject* self, PyObject* args, PyObject* kwargs)
16401634
MYDB_END_ALLOW_THREADS;
16411635

16421636
if (err) {
1643-
Py_XDECREF(secondaryDB->associateCallback);
1644-
secondaryDB->associateCallback = NULL;
1637+
Py_CLEAR(secondaryDB->associateCallback);
16451638
secondaryDB->primaryDBType = 0;
16461639
}
16471640

Modules/_ctypes/_ctypes.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,8 @@ _DictRemover_call(PyObject *_self, PyObject *args, PyObject *kw)
194194
if (-1 == PyDict_DelItem(self->dict, self->key))
195195
/* XXX Error context */
196196
PyErr_WriteUnraisable(Py_None);
197-
Py_DECREF(self->key);
198-
self->key = NULL;
199-
Py_DECREF(self->dict);
200-
self->dict = NULL;
197+
Py_CLEAR(self->key);
198+
Py_CLEAR(self->dict);
201199
}
202200
Py_INCREF(Py_None);
203201
return Py_None;
@@ -3040,10 +3038,8 @@ static int
30403038
PyCFuncPtr_set_restype(PyCFuncPtrObject *self, PyObject *ob)
30413039
{
30423040
if (ob == NULL) {
3043-
Py_XDECREF(self->restype);
3044-
self->restype = NULL;
3045-
Py_XDECREF(self->checker);
3046-
self->checker = NULL;
3041+
Py_CLEAR(self->restype);
3042+
Py_CLEAR(self->checker);
30473043
return 0;
30483044
}
30493045
if (ob != Py_None && !PyType_stgdict(ob) && !PyCallable_Check(ob)) {
@@ -3086,10 +3082,8 @@ PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob)
30863082
PyObject *converters;
30873083

30883084
if (ob == NULL || ob == Py_None) {
3089-
Py_XDECREF(self->converters);
3090-
self->converters = NULL;
3091-
Py_XDECREF(self->argtypes);
3092-
self->argtypes = NULL;
3085+
Py_CLEAR(self->converters);
3086+
Py_CLEAR(self->argtypes);
30933087
} else {
30943088
converters = converters_from_argtypes(ob);
30953089
if (!converters)

Modules/_elementtree.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,10 +2739,10 @@ xmlparser_setevents(XMLParserObject* self, PyObject* args)
27392739
target->events = events;
27402740

27412741
/* clear out existing events */
2742-
Py_XDECREF(target->start_event_obj); target->start_event_obj = NULL;
2743-
Py_XDECREF(target->end_event_obj); target->end_event_obj = NULL;
2744-
Py_XDECREF(target->start_ns_event_obj); target->start_ns_event_obj = NULL;
2745-
Py_XDECREF(target->end_ns_event_obj); target->end_ns_event_obj = NULL;
2742+
Py_CLEAR(target->start_event_obj);
2743+
Py_CLEAR(target->end_event_obj);
2744+
Py_CLEAR(target->start_ns_event_obj);
2745+
Py_CLEAR(target->end_ns_event_obj);
27462746

27472747
if (event_set == Py_None) {
27482748
/* default is "end" only */

Modules/_sqlite/connection.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,7 @@ PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args)
369369
if (self->apsw_connection) {
370370
ret = PyObject_CallMethod(self->apsw_connection, "close", "");
371371
Py_XDECREF(ret);
372-
Py_XDECREF(self->apsw_connection);
373-
self->apsw_connection = NULL;
372+
Py_CLEAR(self->apsw_connection);
374373
self->db = NULL;
375374
} else {
376375
Py_BEGIN_ALLOW_THREADS

Modules/_sqlite/cursor.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,7 @@ int pysqlite_build_row_cast_map(pysqlite_Cursor* self)
231231
if (converter != Py_None) {
232232
Py_DECREF(converter);
233233
}
234-
Py_XDECREF(self->row_cast_map);
235-
self->row_cast_map = NULL;
234+
Py_CLEAR(self->row_cast_map);
236235

237236
return -1;
238237
}
@@ -468,8 +467,7 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
468467
allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) &&
469468
(self->connection->text_factory != pysqlite_OptimizedUnicode));
470469

471-
Py_XDECREF(self->next_row);
472-
self->next_row = NULL;
470+
Py_CLEAR(self->next_row);
473471

474472
if (multiple) {
475473
/* executemany() */
@@ -896,8 +894,7 @@ PyObject* pysqlite_cursor_iternext(pysqlite_Cursor *self)
896894
if (!self->next_row) {
897895
if (self->statement) {
898896
(void)pysqlite_statement_reset(self->statement);
899-
Py_DECREF(self->statement);
900-
self->statement = NULL;
897+
Py_CLEAR(self->statement);
901898
}
902899
return NULL;
903900
}

Modules/cPickle.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,7 @@ Pdata_popList(Pdata *self, Py_ssize_t start)
324324

325325
#define FREE_ARG_TUP(self) { \
326326
if (Py_REFCNT(self->arg) > 1) { \
327-
Py_DECREF(self->arg); \
328-
self->arg=NULL; \
327+
Py_CLEAR(self->arg); \
329328
} \
330329
}
331330

Modules/cdmodule.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -535,10 +535,8 @@ CD_deleteparser(cdparserobject *self, PyObject *args)
535535

536536
/* no sense in keeping the callbacks, so remove them */
537537
for (i = 0; i < NCALLBACKS; i++) {
538-
Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
539-
self->ob_cdcallbacks[i].ob_cdcallback = NULL;
540-
Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
541-
self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
538+
Py_CLEAR(self->ob_cdcallbacks[i].ob_cdcallback);
539+
Py_CLEAR(self->ob_cdcallbacks[i].ob_cdcallbackarg);
542540
}
543541

544542
Py_INCREF(Py_None);
@@ -588,11 +586,9 @@ CD_removecallback(cdparserobject *self, PyObject *args)
588586

589587
CDremovecallback(self->ob_cdparser, (CDDATATYPES) type);
590588

591-
Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback);
592-
self->ob_cdcallbacks[type].ob_cdcallback = NULL;
589+
Py_CLEAR(self->ob_cdcallbacks[type].ob_cdcallback);
593590

594-
Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
595-
self->ob_cdcallbacks[type].ob_cdcallbackarg = NULL;
591+
Py_CLEAR(self->ob_cdcallbacks[type].ob_cdcallbackarg);
596592

597593
Py_INCREF(Py_None);
598594
return Py_None;
@@ -668,10 +664,8 @@ cdparser_dealloc(cdparserobject *self)
668664
int i;
669665

670666
for (i = 0; i < NCALLBACKS; i++) {
671-
Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
672-
self->ob_cdcallbacks[i].ob_cdcallback = NULL;
673-
Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
674-
self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
667+
Py_CLEAR(self->ob_cdcallbacks[i].ob_cdcallback);
668+
Py_CLEAR(self->ob_cdcallbacks[i].ob_cdcallbackarg);
675669
}
676670
CDdeleteparser(self->ob_cdparser);
677671
PyObject_Del(self);

0 commit comments

Comments
 (0)