Skip to content

Commit a22802e

Browse files
committed
bpo-46730: Fix refleak and tighten NULL checks
``PyType_GetQualName`` returns a new reference. Signed-off-by: Christian Heimes <christian@python.org>
1 parent 2945f5a commit a22802e

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

Objects/descrobject.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,18 +1585,22 @@ property_descr_get(PyObject *self, PyObject *obj, PyObject *type)
15851585

15861586
propertyobject *gs = (propertyobject *)self;
15871587
if (gs->prop_get == NULL) {
1588-
if (gs->prop_name != NULL) {
1588+
PyObject *qualname = PyType_GetQualName(Py_TYPE(obj));
1589+
if (gs->prop_name != NULL && qualname != NULL) {
15891590
PyErr_Format(PyExc_AttributeError,
15901591
"property %R of %R object has no getter",
15911592
gs->prop_name,
1592-
PyType_GetQualName(Py_TYPE(obj)));
1593+
qualname);
15931594
}
1594-
else {
1595+
else if (qualname != NULL) {
15951596
PyErr_Format(PyExc_AttributeError,
15961597
"property of %R object has no getter",
1597-
PyType_GetQualName(Py_TYPE(obj)));
1598+
qualname);
1599+
} else {
1600+
PyErr_SetString(PyExc_AttributeError,
1601+
"property has no getter");
15981602
}
1599-
1603+
Py_XDECREF(qualname);
16001604
return NULL;
16011605
}
16021606

@@ -1617,27 +1621,32 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
16171621
}
16181622

16191623
if (func == NULL) {
1620-
if (gs->prop_name != NULL && obj != NULL) {
1624+
PyObject *qualname = NULL;
1625+
if (obj != NULL) {
1626+
qualname = PyType_GetQualName(Py_TYPE(obj));
1627+
}
1628+
if (gs->prop_name != NULL && qualname != NULL) {
16211629
PyErr_Format(PyExc_AttributeError,
16221630
value == NULL ?
16231631
"property %R of %R object has no deleter" :
16241632
"property %R of %R object has no setter",
16251633
gs->prop_name,
1626-
PyType_GetQualName(Py_TYPE(obj)));
1634+
qualname);
16271635
}
1628-
else if (obj != NULL) {
1636+
else if (qualname != NULL) {
16291637
PyErr_Format(PyExc_AttributeError,
16301638
value == NULL ?
16311639
"property of %R object has no deleter" :
16321640
"property of %R object has no setter",
1633-
PyType_GetQualName(Py_TYPE(obj)));
1641+
qualname);
16341642
}
16351643
else {
16361644
PyErr_SetString(PyExc_AttributeError,
16371645
value == NULL ?
16381646
"property has no deleter" :
16391647
"property has no setter");
16401648
}
1649+
Py_XDECREF(qualname);
16411650
return -1;
16421651
}
16431652

0 commit comments

Comments
 (0)