changeset: 101272:1c6326e81c33 parent: 101270:c61d2c43d22e parent: 101271:cd25508c62fc user: Serhiy Storchaka date: Sun May 08 20:46:55 2016 +0300 files: Misc/NEWS Modules/_curses_panel.c Modules/_tkinter.c description: Issue #23815: Fixed crashes related to directly created instances of types in _tkinter and curses.panel modules. diff -r c61d2c43d22e -r 1c6326e81c33 Lib/test/test_curses.py --- a/Lib/test/test_curses.py Sun May 08 14:02:35 2016 +0000 +++ b/Lib/test/test_curses.py Sun May 08 20:46:55 2016 +0300 @@ -285,6 +285,10 @@ panel.set_userptr(A()) panel.set_userptr(None) + def test_new_curses_panel(self): + panel = curses.panel.new_panel(self.stdscr) + self.assertRaises(TypeError, type(panel)) + @unittest.skipUnless(hasattr(curses, 'resizeterm'), 'resizeterm not available') def test_resize_term(self): diff -r c61d2c43d22e -r 1c6326e81c33 Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py Sun May 08 14:02:35 2016 +0000 +++ b/Lib/test/test_tcl.py Sun May 08 20:46:55 2016 +0300 @@ -649,6 +649,8 @@ expected = {'a': (1, 2, 3), 'something': 'foo', 'status': ''} self.assertEqual(splitdict(tcl, arg), expected) + def test_new_tcl_obj(self): + self.assertRaises(TypeError, _tkinter.Tcl_Obj) class BigmemTclTest(unittest.TestCase): diff -r c61d2c43d22e -r 1c6326e81c33 Misc/NEWS --- a/Misc/NEWS Sun May 08 14:02:35 2016 +0000 +++ b/Misc/NEWS Sun May 08 20:46:55 2016 +0300 @@ -265,6 +265,9 @@ Library ------- +- Issue #23815: Fixed crashes related to directly created instances of types in + _tkinter and curses.panel modules. + - Issue #17765: weakref.ref() no longer silently ignores keyword arguments. Patch by Georg Brandl. diff -r c61d2c43d22e -r 1c6326e81c33 Modules/_curses_panel.c --- a/Modules/_curses_panel.c Sun May 08 14:02:35 2016 +0000 +++ b/Modules/_curses_panel.c Sun May 08 20:46:55 2016 +0300 @@ -506,10 +506,11 @@ d = PyModule_GetDict(m); /* Initialize object type */ - _curses_panelstate(m)->PyCursesPanel_Type = \ - PyType_FromSpec(&PyCursesPanel_Type_spec); - if (_curses_panelstate(m)->PyCursesPanel_Type == NULL) + v = PyType_FromSpec(&PyCursesPanel_Type_spec); + if (v == NULL) goto fail; + ((PyTypeObject *)v)->tp_new = NULL; + _curses_panelstate(m)->PyCursesPanel_Type = v; import_curses(); if (PyErr_Occurred()) diff -r c61d2c43d22e -r 1c6326e81c33 Modules/_tkinter.c --- a/Modules/_tkinter.c Sun May 08 14:02:35 2016 +0000 +++ b/Modules/_tkinter.c Sun May 08 20:46:55 2016 +0300 @@ -3544,6 +3544,7 @@ Py_DECREF(m); return NULL; } + ((PyTypeObject *)o)->tp_new = NULL; if (PyModule_AddObject(m, "TkappType", o)) { Py_DECREF(o); Py_DECREF(m); @@ -3556,6 +3557,7 @@ Py_DECREF(m); return NULL; } + ((PyTypeObject *)o)->tp_new = NULL; if (PyModule_AddObject(m, "TkttType", o)) { Py_DECREF(o); Py_DECREF(m); @@ -3568,6 +3570,7 @@ Py_DECREF(m); return NULL; } + ((PyTypeObject *)o)->tp_new = NULL; if (PyModule_AddObject(m, "Tcl_Obj", o)) { Py_DECREF(o); Py_DECREF(m);