Skip to content

Commit efffb29

Browse files
committed
gh-161388: [tkinter] Fix crash on raising __str__ method passed to setvar
1 parent aaaf61c commit efffb29

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

‎Lib/test/test_tcl.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,17 @@ def test_returning_deeply_nested(self):
596596
% support.exceeds_recursion_limit())
597597
self.assertRaises(RecursionError, interp.getvar, 'x')
598598

599+
def test_setvar_evil(self):
600+
# gh-161388
601+
class StrRaises:
602+
def __str__(self):
603+
raise RuntimeError("setvar evil")
604+
605+
setvar = self.interp.tk.setvar
606+
default = StrRaises()
607+
with self.assertRaisesRegex(RuntimeError, "setvar evil"):
608+
setvar("name1", "name2", default)
609+
599610
def test_user_command(self):
600611
result = None
601612
def testfunc(arg):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixes a crash when passing objects with raising :meth:`~object.__str__`
2+
method to :meth:`~tkinter.Misc.setvar`.

‎Modules/_tkinter.c‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ AsObjNested(PyObject *value, int depth)
12351235
{
12361236
PyObject *v = PyObject_Str(value);
12371237
if (!v)
1238-
return 0;
1238+
return NULL;
12391239
result = AsObjNested(v, depth);
12401240
Py_DECREF(v);
12411241
return result;
@@ -2101,6 +2101,9 @@ SetVar(TkappObject *self, PyObject *args, int flags)
21012101

21022102
/* XXX must hold tcl lock already??? */
21032103
newval = AsObj(newValue);
2104+
if (newval == NULL) {
2105+
return NULL;
2106+
}
21042107
if (self->trace) {
21052108
if (flags & TCL_GLOBAL_ONLY) {
21062109
TRACE(self, ("((sssNO))", "uplevel", "#0", "set",

0 commit comments

Comments
 (0)