Added test and fix for segfault in namemapper where exception is thrown by __getattr__.

This commit is contained in:
Jon Siddle 2010-09-14 15:08:26 +01:00 committed by R. Tyler Croy
parent a969475248
commit 0287a0833c
3 changed files with 21 additions and 6 deletions

View File

@ -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__':

View File

@ -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

View File

@ -188,14 +188,15 @@ 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);
if (i > 0) {
Py_DECREF(currentVal);
}
return NULL;
}
// any exceptions results in failure
if (i > 0) {
Py_DECREF(currentVal);
}
return NULL;
}
}
if (i > 0) {