Skip to content

Commit

Permalink
Issue python#16447: Fix potential segfault when setting __name__ on a…
Browse files Browse the repository at this point in the history
… class.
  • Loading branch information
mdickinson committed Apr 13, 2013
1 parent eff6444 commit 64aafeb
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
14 changes: 14 additions & 0 deletions Lib/test/test_descr.py
Original file line number Diff line number Diff line change
Expand Up @@ -3997,6 +3997,20 @@ class C(object):
C.__name__ = 'D.E'
self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))

def test_evil_type_name(self):
# A badly placed Py_DECREF in type_set_name led to arbitrary code
# execution while the type structure was not in a sane state, and a
# possible segmentation fault as a result. See bug #16447.
class Nasty(str):
def __del__(self):
C.__name__ = "other"

class C:
pass

C.__name__ = Nasty("abc")
C.__name__ = "normal"

def test_subclass_right_op(self):
# Testing correct dispatch of subclass overloading __r<op>__...

Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ What's New in Python 3.3.2?
Core and Builtins
-----------------

- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
class.

- Issue #17669: Fix crash involving finalization of generators using yield from.

- Issue #17619: Make input() check for Ctrl-C correctly on Windows.
Expand Down
5 changes: 4 additions & 1 deletion Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,13 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)

Py_INCREF(value);

Py_DECREF(et->ht_name);
/* Wait until et is a sane state before Py_DECREF'ing the old et->ht_name
value. (Bug #16447.) */
tmp = et->ht_name;
et->ht_name = value;

type->tp_name = tp_name;
Py_DECREF(tmp);

return 0;
}
Expand Down

0 comments on commit 64aafeb

Please sign in to comment.