summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2008-01-11 19:48:46 +0000
committerThomas Heller <theller@ctypes.org>2008-01-11 19:48:46 +0000
commitb9c741c43cdd08a18120f23cfca81afeaead9820 (patch)
treeb533ae8c7725497266e60b5ad6fba4878c03454e
parentc5bb8684145e80a2410bd1956b068706db61c794 (diff)
downloadcpython-git-b9c741c43cdd08a18120f23cfca81afeaead9820.tar.gz
Added NEWS entry, plus:
Merged revisions 59925 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk/Modules/_ctypes ........ r59925 | thomas.heller | 2008-01-11 20:34:06 +0100 (Fr, 11 Jan 2008) | 5 lines Raise an error instead of crashing with a segfault when a NULL function pointer is called. Will backport to release25-maint. ........
-rw-r--r--Lib/ctypes/test/test_funcptr.py6
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_ctypes/_ctypes.c5
3 files changed, 13 insertions, 0 deletions
diff --git a/Lib/ctypes/test/test_funcptr.py b/Lib/ctypes/test/test_funcptr.py
index 7ea873f0a4..92bf89bb60 100644
--- a/Lib/ctypes/test/test_funcptr.py
+++ b/Lib/ctypes/test/test_funcptr.py
@@ -123,5 +123,11 @@ class CFuncPtrTestCase(unittest.TestCase):
self.failUnlessEqual(strtok(None, "\n"), "c")
self.failUnlessEqual(strtok(None, "\n"), None)
+ def test_NULL_funcptr(self):
+ tp = CFUNCTYPE(c_int)
+ func = tp() # NULL function pointer
+ # raise a ValueError when we try to call it
+ self.assertRaises(ValueError, func)
+
if __name__ == '__main__':
unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
index 47b3c5a9a0..1e742fb374 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5.2c1?
Core and builtins
-----------------
+- Prevent a segfault when a ctypes NULL function pointer is called.
+
- Bug #1517: Possible segfault in lookup().
- Issue #1638: %zd configure test fails on Linux.
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 73b5cbdc2e..47fab8a00a 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -3305,6 +3305,11 @@ CFuncPtr_call(CFuncPtrObject *self, PyObject *inargs, PyObject *kwds)
pProc = *(void **)self->b_ptr;
+ if (pProc == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "attempt to call NULL function pointer");
+ return NULL;
+ }
#ifdef MS_WIN32
if (self->index) {
/* It's a COM method */