X Tutup
Skip to content

Commit 8060aa5

Browse files
authored
gh-145376: Fix various refleaks in Objects/ (#145609)
1 parent 201e183 commit 8060aa5

File tree

7 files changed

+16
-7
lines changed

7 files changed

+16
-7
lines changed

Modules/_cursesmodule.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,11 +1112,13 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
11121112
attr_old = getattrs(self->win);
11131113
if (curses_wattrset(self, attr, "addstr") < 0) {
11141114
curses_release_wstr(strtype, wstr);
1115+
Py_XDECREF(bytesobj);
11151116
return NULL;
11161117
}
11171118
}
11181119
#ifdef HAVE_NCURSESW
11191120
if (strtype == 2) {
1121+
assert(bytesobj == NULL);
11201122
if (use_xy) {
11211123
rtn = mvwaddwstr(self->win,y,x,wstr);
11221124
funcname = "mvwaddwstr";
@@ -1130,6 +1132,7 @@ _curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
11301132
else
11311133
#endif
11321134
{
1135+
assert(wstr == NULL);
11331136
const char *str = PyBytes_AS_STRING(bytesobj);
11341137
if (use_xy) {
11351138
rtn = mvwaddstr(self->win,y,x,str);
@@ -1210,6 +1213,7 @@ _curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1,
12101213
attr_old = getattrs(self->win);
12111214
if (curses_wattrset(self, attr, "addnstr") < 0) {
12121215
curses_release_wstr(strtype, wstr);
1216+
Py_XDECREF(bytesobj);
12131217
return NULL;
12141218
}
12151219
}
@@ -2212,6 +2216,7 @@ _curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1,
22122216
attr_old = getattrs(self->win);
22132217
if (curses_wattrset(self, attr, "insstr") < 0) {
22142218
curses_release_wstr(strtype, wstr);
2219+
Py_XDECREF(bytesobj);
22152220
return NULL;
22162221
}
22172222
}

Modules/binascii.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ binascii_a2b_ascii85_impl(PyObject *module, Py_buffer *data, int foldspaces,
924924
}
925925
unsigned char *bin_data = PyBytesWriter_GetData(writer);
926926
if (bin_data == NULL) {
927-
return NULL;
927+
goto error;
928928
}
929929

930930
uint32_t leftchar = 0;

Objects/genericaliasobject.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ subs_tvars(PyObject *obj, PyObject *params,
299299
&PyTuple_GET_ITEM(arg, 0),
300300
PyTuple_GET_SIZE(arg));
301301
if (j < 0) {
302+
Py_DECREF(subparams);
303+
Py_DECREF(subargs);
302304
return NULL;
303305
}
304306
continue;
@@ -455,6 +457,7 @@ _Py_subs_parameters(PyObject *self, PyObject *args, PyObject *parameters, PyObje
455457
if (is_args_list) {
456458
args = tuple_args = PySequence_Tuple(args);
457459
if (args == NULL) {
460+
Py_DECREF(item);
458461
return NULL;
459462
}
460463
}

Objects/object.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,7 @@ _PyObject_SetAttributeErrorContext(PyObject* v, PyObject* name)
12951295
// Augment the exception with the name and object
12961296
if (PyObject_SetAttr(exc, &_Py_ID(name), name) ||
12971297
PyObject_SetAttr(exc, &_Py_ID(obj), v)) {
1298+
Py_DECREF(exc);
12981299
return 1;
12991300
}
13001301
restore:
@@ -3077,9 +3078,9 @@ Py_ReprEnter(PyObject *obj)
30773078
list = PyList_New(0);
30783079
if (list == NULL)
30793080
return -1;
3080-
if (PyDict_SetItem(dict, &_Py_ID(Py_Repr), list) < 0)
3081+
if (_PyDict_SetItem_Take2((PyDictObject *)dict, &_Py_ID(Py_Repr), list) < 0) {
30813082
return -1;
3082-
Py_DECREF(list);
3083+
}
30833084
}
30843085
i = PyList_GET_SIZE(list);
30853086
while (--i >= 0) {

Objects/structseq.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,8 @@ initialize_structseq_dict(PyStructSequence_Desc *desc, PyObject* dict,
515515
}
516516

517517
if (_PyTuple_Resize(&keys, k) == -1) {
518-
goto error;
518+
assert(keys == NULL);
519+
return -1;
519520
}
520521

521522
if (PyDict_SetItemString(dict, match_args_key, keys) < 0) {

Objects/typevarobject.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2305,13 +2305,12 @@ generic_class_getitem(PyObject *cls, PyObject *args, PyObject *kwargs)
23052305
PyObject *
23062306
_Py_subscript_generic(PyThreadState* unused, PyObject *params)
23072307
{
2308-
params = unpack_typevartuples(params);
2309-
23102308
PyInterpreterState *interp = _PyInterpreterState_GET();
23112309
if (interp->cached_objects.generic_type == NULL) {
23122310
PyErr_SetString(PyExc_SystemError, "Cannot find Generic type");
23132311
return NULL;
23142312
}
2313+
params = unpack_typevartuples(params);
23152314
PyObject *args[2] = {(PyObject *)interp->cached_objects.generic_type, params};
23162315
PyObject *result = call_typing_func_object("_GenericAlias", args, 2);
23172316
Py_DECREF(params);

Objects/unicodeobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5220,7 +5220,7 @@ unicode_decode_utf8_impl(_PyUnicodeWriter *writer,
52205220
}
52215221

52225222
if (_PyUnicodeWriter_Prepare(writer, end - s, 127) < 0) {
5223-
return -1;
5223+
goto onError;
52245224
}
52255225
}
52265226
}

0 commit comments

Comments
 (0)
X Tutup