Bugs item #1174712, was opened at 2005-04-01 09:22
Message generated for change (Comment added) made by arigo
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1174712&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Interpreter Core
Group: None
>Status: Closed
>Resolution: Fixed
Priority: 5
Private: No
Submitted By: Armin Rigo (arigo)
Assigned to: Nobody/Anonymous (nobody)
Summary: subclassing ModuleType and another built-in type

Initial Comment:
class X(types.ModuleType, str): pass
X('name')
-> segfault

This buggy subclassing goes through typeobject.c's checks because 
PyModuleObject looks exactly like a user-defined subclass of 'object': it has a 
PyObject_HEAD followed only by the dict, as specified by tp_dictoffset.

A fix would be to forbid any subclassing to move the tp_dictoffset of a 
non-heap type.

----------------------------------------------------------------------

>Comment By: Armin Rigo (arigo)
Date: 2007-05-02 19:25

Message:
Logged In: YES 
user_id=4771
Originator: YES

Fixed by zseil's patch for #1303614, r55080.

----------------------------------------------------------------------

Comment By: Armin Rigo (arigo)
Date: 2005-12-14 14:57

Message:
Logged In: YES 
user_id=4771

The objection to the proposed fix is not valid in light
of the bug #1303614, which gives a general way to abuse
subclassing to allow the __dict__ of an instance to be
assigned to and deleted, even when it should not be allowed.  So I
wouldn't worry too much about the case I pointed up, because it should be
fixed together with #1303614 (though I don't really know how).  For now I
would be happy with just checking that subclassing a non-heap type doesn't
move the dict within the structure.

The same remark probably applies to the weakref field.  Both cases could
be fixed by being more careful in typeobject.c:extra_ivars(): PyModule_Type
should be considered to have extra_ivars() when compared to
PyBaseObject_Type.  This could be achieved by skipping the "t_size -= ..."
part if "type" is not a heap type.  Indeed, for non-heap types we should
not try to consider that an extra dict or weakref slot is not important,
because the C code probably accesses this extra slot directly, as in the
case of moduleobject.c.

----------------------------------------------------------------------

Comment By: Michael Hudson (mwh)
Date: 2005-04-03 13:39

Message:
Logged In: YES 
user_id=6656

> This might point to the need for cleaning up typeobject.c's
> darker corners...

No kidding.  Maybe Samuele, you and I can gang up on Guido at 
EuroPython (is he sprinting?  Perhaps we should ask).

----------------------------------------------------------------------

Comment By: Armin Rigo (arigo)
Date: 2005-04-02 12:27

Message:
Logged In: YES 
user_id=4771

The proposed fix is not good enough.  If another built-in C type similar
to PyModuleObject is defined (say by a C extension module), then it would
become possible to subclass both this new type and ModuleType.  This might
lead to unwanted behavior if e.g. one parent class allows rebinding
__dict__ and the other not (and crashes if __dict__ is rebound).

This might point to the need for cleaning up typeobject.c's darker
corners...

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1174712&group_id=5470
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to