Commit 981eacbd authored by Andreas Jung's avatar Andreas Jung

- Collector #1406: fixed segmentation fault by acquisition

parent 45f94321
...@@ -466,7 +466,7 @@ Wrapper_findattr(Wrapper *self, PyObject *oname, ...@@ -466,7 +466,7 @@ Wrapper_findattr(Wrapper *self, PyObject *oname,
ASSIGN(r,PyECMethod_New(r,OBJECT(self))); ASSIGN(r,PyECMethod_New(r,OBJECT(self)));
else if (has__of__(r)) ASSIGN(r,__of__(r,OBJECT(self))); else if (has__of__(r)) ASSIGN(r,__of__(r,OBJECT(self)));
if (filter) if (r && filter)
switch(apply_filter(filter,OBJECT(self),oname,r,extra,orig)) switch(apply_filter(filter,OBJECT(self),oname,r,extra,orig))
{ {
case -1: return NULL; case -1: return NULL;
......
...@@ -534,6 +534,33 @@ def test_simple(): ...@@ -534,6 +534,33 @@ def test_simple():
""" """
def test__of__exception():
"""
Wrapper_findattr did't check for an exception in a user defined
__of__ method before passing the result to the filter. In this
case the 'value' argument of the filter was NULL, which caused
a segfault when being accessed.
>>> class UserError(Exception):
... pass
...
>>> class X(Acquisition.Implicit):
... def __of__(self, parent):
... if Acquisition.aq_base(parent) is not parent:
... raise UserError, 'ack'
... return X.inheritedAttribute('__of__')(self, parent)
...
>>> a = I('a')
>>> a.b = I('b')
>>> a.b.x = X('x')
>>> Acquisition.aq_acquire(a.b, 'x',
... lambda self, object, name, value, extra: repr(value))
Traceback (most recent call last):
...
UserError: ack
"""
def test_muliple(): def test_muliple():
r""" r"""
>>> a = I('a') >>> a = I('a')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment