Added test and fix for segfault in namemapper where exception is thrown by __getattr__.
This commit is contained in:
parent
a969475248
commit
0287a0833c
|
@ -58,7 +58,8 @@ def main():
|
|||
os.putenv('PYTHONPATH', libdir)
|
||||
|
||||
rc = subprocess.call( ['python',] + args )
|
||||
|
||||
if rc == -11:
|
||||
logging.error('Segmentation fault in test process. Test failed.')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -43,6 +43,10 @@ class DummyClass(object):
|
|||
except:
|
||||
raise
|
||||
|
||||
class DummyClassGetAttrRaises(object):
|
||||
def __getattr__(self, name):
|
||||
raise ValueError
|
||||
|
||||
|
||||
def dummyFunc(arg="Scooby"):
|
||||
return arg
|
||||
|
@ -67,6 +71,7 @@ testNamespace = {
|
|||
'aClass': DummyClass,
|
||||
'aFunc': dummyFunc,
|
||||
'anObj': DummyClass(),
|
||||
'anObjThatRaises': DummyClassGetAttrRaises(),
|
||||
'aMeth': DummyClass().meth1,
|
||||
'none': None,
|
||||
'emptyString': '',
|
||||
|
@ -419,6 +424,14 @@ class VFN(NameMapperTest):
|
|||
for i in range(10):
|
||||
self.get('aDict.nestedDict.funcThatRaises', False)
|
||||
|
||||
def test61(self):
|
||||
"""Accessing attribute where __getattr__ raises shouldn't segfault if something follows it"""
|
||||
|
||||
def test(self=self):
|
||||
self.get('anObjThatRaises.willraise.anything')
|
||||
self.assertRaises(ValueError, test)
|
||||
|
||||
|
||||
class VFS(VFN):
|
||||
_searchListLength = 1
|
||||
|
||||
|
|
|
@ -188,16 +188,17 @@ static PyObject *PyNamemapper_valueForName(PyObject *obj, char *nameChunks[], in
|
|||
nextVal = PyObject_GetAttrString(currentVal, currentKey);
|
||||
exc = PyErr_Occurred();
|
||||
if (exc != NULL) {
|
||||
// if exception == AttributeError
|
||||
// if exception == AttributeError, report our own exception
|
||||
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
||||
setNotFoundException(currentKey, currentVal);
|
||||
}
|
||||
// any exceptions results in failure
|
||||
if (i > 0) {
|
||||
Py_DECREF(currentVal);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (i > 0) {
|
||||
Py_DECREF(currentVal);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue